部署Node.js应用至Heroku报H10、H20错误无法访问如何解决
Heroku Node.js 部署报H10、H20错误修复方案
H10为应用启动崩溃错误,H20为应用启动超时错误,两类错误同时出现基本都是启动阶段配置异常、代码运行报错,导致进程没有正常绑定Heroku分配的HTTP端口导致,按以下步骤逐一排查即可:
先拉取应用实时日志定位具体报错,不要盲目改配置
本地执行命令:heroku logs --tail -a log-app-nodejs执行后保持窗口打开,访问一次应用地址,日志里会直接打印具体崩溃原因,比如缺依赖、找不到文件、代码语法错误等,优先按日志栈修复对应问题。
高频问题逐一排查
- 端口硬编码错误:Heroku会动态分配启动端口,存在
process.env.PORT环境变量里,代码里绝对不能硬编码监听3000、8080这类固定端口,监听逻辑必须改成:
硬编码固定端口100%触发H10错误。const PORT = process.env.PORT || 3000 app.listen(PORT, () => { console.log(`服务运行在${PORT}端口`) }) - 启动脚本配置错误:检查项目根目录
package.json里的scripts字段,必须配置正确的start命令,比如入口文件是index.js就写:
Heroku部署完成后默认执行"scripts": { "start": "node index.js" }npm start启动应用,没有配置start脚本、脚本里的入口文件路径写错(比如大小写和实际文件不一致,Heroku底层是Linux系统,文件名大小写敏感)都会直接启动崩溃。如果是TypeScript项目、需要提前编译源码,要额外配置postinstall脚本执行编译命令,保证启动时能找到编译后的产物。 - 依赖分类错误:不要把express、数据库驱动这类运行时需要的依赖装到
devDependencies里,Heroku生产环境默认不会安装开发依赖,启动时找不到对应包会直接抛错。本地可以执行npm install --production && npm start模拟生产环境启动,如果这步本地跑不通,Heroku上必然启动失败。 - Procfile配置错误:如果项目根目录手动创建了Procfile,要确认进程类型是
web,启动命令正确,示例:
误把进程类型写成web: npm startworker会导致HTTP端口没有绑定,直接触发启动错误。 - 启动阻塞超时:如果以上配置都正确还是报H20超时,检查启动逻辑里有没有阻塞操作:比如启动阶段同步加载超大文件、数据库/第三方服务连接配置错误导致连不上卡很久、大量同步计算占用时间,导致启动超过Heroku默认的60秒超时阈值。这类问题把非必要的初始化逻辑挪到端口监听成功之后再执行,同时检查外接服务的连接配置、IP白名单是否正确。
- 端口硬编码错误:Heroku会动态分配启动端口,存在
本地验证通过再推代码:
- 删除本地node_modules文件夹
- 执行
npm install --production- 本地模拟Heroku端口环境启动:Mac/Linux执行
PORT=5000 npm start,Windows CMD执行set PORT=5000 && npm start- 访问本地
localhost:5000确认服务正常响应,无报错本地验证无问题后,提交改动推送到Heroku即可:
git add . git commit -m "fix: resolve heroku startup crash" git push heroku main
内容的提问来源于stack exchange,提问作者Rishabh pawar
相关产品推荐
相关产品推荐

