MERN Stack应用部署至Heroku时触发ELIFECYCLE报错问题求助
报错原因
- 核心错误是日志中输出的
sh: 1: run: not found:你在heroku-postbuild脚本中使用了独立的run指令,Linux系统没有原生run命令,npm执行自定义脚本的正确格式为npm run [脚本名称],错误的命令写法直接触发了找不到命令的报错。 - 脚本存在无效逻辑:
NPM_CONFIG_PRODUCTION=false npm install npm属于多余操作,重复安装npm不会优化部署流程,反而会增加构建耗时。 - 额外注意:你当前的
start脚本用了nodemon启动服务,nodemon是开发环境用的热重载工具,生产环境不需要,也可能引发Heroku部署的额外报错。
解决方案
根据你的部署习惯选择对应方案即可:
方案1:使用本地提前构建好的React产物部署
你已经提到本地build产物可以正常运行,不需要在Heroku端重复构建,直接修改后端package.json的scripts配置:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node app.js", "heroku-postbuild": "" }
同时在后端入口文件app.js中添加静态资源托管逻辑,关联React构建产物:
const express = require('express') const path = require('path') const app = express() // 托管React构建产物的静态资源 app.use(express.static(path.join(__dirname, '../build'))) // 所有非接口请求返回React入口文件,支持前端路由 app.get('*', (req, res) => { res.sendFile(path.join(__dirname, '../build/index.html')) })
方案2:让Heroku自动执行前端构建流程
如果不想本地提前打包,希望推送代码后Heroku自动构建前端,需要调整heroku-postbuild脚本(假设前端代码存放在后端同级的client目录中):
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node app.js", "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false cd ../client && npm install && npm run build" }
内容的提问来源于stack exchange,提问作者Nigel
相关产品推荐
相关产品推荐

