Heroku部署Node+MongoDB+Express应用启动失败解决方案
问题现象
按照官方步骤在Heroku部署Node.js+MongoDB+Express栈的后端应用,构建显示成功,但访问应用地址直接返回错误页面:
本地localhost环境运行完全正常,Stack Overflow检索到的常规方案尝试后均无效。
已排查的配置信息
- 当前Procfile配置:
web: npm run start
- 部署构建阶段日志显示构建成功,曾误以为日志中的
NPM_CONFIG_LOGLEVEL=error是核心报错 - 原始package.json配置:
{ "name": "server", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "proxy": "http://localhost:5001", "scripts": { "start": "nodemon index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "b": "^2.0.1", "body-parser": "^1.20.0", "cors": "^2.8.5", "dotenv": "^16.0.1", "express": "^4.18.1", "mongoose": "^6.4.0" }, "engines": { "node": "15.x" } }
- 运行时执行
heroku logs --tail抓取到核心报错:
sh: 1: nodemon: not found Process exited with status 127 State changed from starting to crashed at=error code=H10 desc="App crashed" method=GET path="/" status=503
- 项目入口index.js逻辑:配置了基础中间件、
/posts路由,根路径返回Hello to Memories API,从环境变量读取端口和MongoDB连接地址启动服务。
问题根因
核心报错就是nodemon: not found,和Procfile、NPM_CONFIG_LOGLEVEL配置无关:
- nodemon是本地开发用的文件监听热重载工具,你没有把它加到package.json的依赖列表里,Heroku生产环境构建时默认会裁剪所有devDependencies,不会安装开发阶段用的工具包
- 生产环境本身就不应该用nodemon启动服务,热重载能力在线上运行时完全不需要,反而会增加不必要的资源开销。
你本地能正常跑是因为本地全局或者在项目里单独装过nodemon,Heroku的全新生产环境没有这个包,自然会报命令不存在的127退出码,最终触发H10应用崩溃、返回503错误。另外构建日志里的NPM_CONFIG_LOGLEVEL=error是Heroku Node.js构建环境的默认配置,意思是npm安装依赖时只输出错误级别的日志,属于正常输出,不是报错。
修复方案
- 修改package.json的scripts配置,拆分生产启动和本地开发命令:
"scripts": { "start": "node index.js", "dev": "nodemon index.js" },
本地开发时执行npm run dev就能保留之前nodemon热重载的使用体验,生产环境npm run start直接用node启动服务,不需要依赖nodemon。
- 现有Procfile的
web: npm run start配置不需要修改,改完package.json后提交代码重新推送到Heroku即可完成部署:
git add . git commit -m "fix: use node to start app in production env" git push heroku master
- 部署前额外检查Heroku后台的Config Vars配置,确认已经添加
CONNECTION_URL环境变量,填入你的MongoDB连接地址,避免服务启动后因连不上数据库崩溃。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

