Next.js自定义服务器如何将console.log输出到运行终端
问题原因
你直接执行next dev或next start时,启动的是Next.js内置的默认服务,完全不会加载你编写的这份Express自定义服务代码,不仅你写的console.log不会输出,你配置的helmet、接口代理等中间件也全部不会生效。
另外你代码里把Next实例的dev参数硬编码为false,开发环境下会丢失热更新、错误提示等开发能力。
解决步骤
1. 修正自定义服务代码
首先把硬编码的dev参数改成根据运行环境自动判断,修改对应代码段:
// 替换原来的 const app = next({ dev: false }); const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler();
假设你把这份自定义服务代码保存为项目根目录下的server.js。
2. 修改启动脚本
替换package.json里的原有scripts配置,不要直接用Next默认的启动命令,改为直接运行你的自定义服务文件:
{ "scripts": { "dev": "NODE_ENV=development node server.js", "build": "next build", "start": "NODE_ENV=production node server.js" } }
- 如果你是Windows系统,为了跨平台兼容环境变量设置,可以先安装
cross-env依赖,把脚本里的环境变量设置部分改为cross-env NODE_ENV=xxx即可。 - 如果需要开发环境下修改
server.js自动重启服务,可以安装nodemon作为开发依赖,把dev脚本改为nodemon server.js。
3. 注意端口权限
你的代码里服务监听的是80端口,在Linux、macOS系统下,1024以下的端口需要管理员权限才能启动,执行启动命令时需要加sudo,否则会报权限错误。如果不需要强制用80端口,建议改成3000等大于1024的端口避免权限问题。
验证效果
配置完成后:
- 开发环境执行
npm run dev/yarn dev,启动后终端就会打印你写的> Ready on port 80日志,后续你在自定义服务里加的所有服务端console.log都会正常输出到当前终端。 - 生产环境先执行
npm run build/yarn build完成打包,再执行npm run start/yarn start,日志同样会正常输出到启动服务的终端。
内容的提问来源于stack exchange,提问作者william007
相关产品推荐
相关产品推荐

