NodeJS应用部署到Heroku时报pre-receive hook declined错误如何解决?
报错原因
! [remote rejected] master -> master (pre-receive hook declined) 是Heroku远端接收代码前的预校验流程失败触发的报错,针对NodeJS项目常见触发原因如下:
- 项目根目录缺失
package.json文件,或package.json存放在子目录下,Heroku无法识别项目类型 package.json未配置engines字段,或指定的Node.js、npm版本不在Heroku当前支持的版本范围内- 生产环境所需依赖错误写入
devDependencies字段,Heroku默认不安装开发依赖导致构建失败 - 本地master分支代码版本落后于Heroku远端版本,存在版本冲突
package.json的scripts字段中未配置start启动指令,Heroku无法完成应用启动校验- 项目构建命令执行报错,比如依赖安装失败、前端资源编译失败等
解决方案
- 确认
package.json存放在项目根目录,如果项目代码存放在子目录,可使用git subtree push --prefix 子目录路径 heroku master命令推送指定子目录 - 在
package.json中添加engines配置,指定Heroku支持的运行版本,示例配置如下:
{ "engines": { "node": "18.x", "npm": "9.x" } }
- 核对所有生产环境依赖都写入
dependencies字段,也可执行heroku config:set NPM_CONFIG_PRODUCTION=false配置Heroku安装全部依赖做临时排查 - 先拉取远端最新代码解决冲突后再推送,依次执行:
git pull heroku master # 解决代码冲突后执行提交 git push heroku master - 确认
package.json的scripts中配置了正确的start指令,示例如下:
{ "scripts": { "start": "node app.js" } }
- 本地先执行
npm install、npm run build(如果有构建配置)确认本地构建无报错后再推送 - 执行
heroku logs --tail查看完整的构建运行日志,定位具体的错误点做针对性修复
内容的提问来源于stack exchange,提问作者Mohammad Ali
相关产品推荐
相关产品推荐

