部署Express应用到Heroku出现H10 App crashed错误如何解决
Express.js 部署 Heroku 报 H10 App crashed 修复方案
核心原因说明
H10错误本质是Node进程启动阶段直接异常退出,你日志里的Process exited with status 1已经印证了这点——进程没成功跑起来就挂了,路由请求自然全部返回503。结合你贴的代码,几个高概率诱因和修复方法如下:
先解决日志看不到具体错误的问题
你现在贴的日志只有Heroku平台层面的进程退出记录,没有应用本身的错误栈,根本没法直接定位根因,先给代码加全局异常捕获,把启动时的错误打出来:
替换你现有server.js的内容为:
const express = require('express'); const morgan = require('morgan'); const cors = require('cors'); const connectDB = require('./config/db'); // 捕获启动阶段所有未处理的异常,打印完整错误栈 process.on('uncaughtException', err => { console.error('启动异常:', err); process.exit(1); }); process.on('unhandledRejection', err => { console.error('异步调用异常:', err); process.exit(1); }); const app = express(); if (process.env.NODE_ENV === 'development') { app.use(morgan('dev')); } app.use(cors()); const PORT = process.env.PORT || 3000; // 先连数据库,成功后再启动监听 const start = async () => { try { await connectDB(); // 你之前引入了数据库连接方法但根本没调用,这里补上 app.listen(PORT, () => console.log(`服务启动成功,监听端口:${PORT}`)); } catch (err) { console.error('服务启动失败:', err); process.exit(1); } }; start();
改完提交推送到Heroku后,执行heroku logs --tail看实时日志,就能看到具体是哪行代码导致崩溃。
高频踩坑点排查
90%的同类问题都是以下几个原因,逐个核对:
- 环境变量缺失:本地存在
.env文件里的配置(比如数据库连接串、密钥),Heroku平台的Config Vars里没配置,导致数据库连接失败、变量读取报错。注意不要把.env文件提交到git,Heroku环境必须在后台面板手动配置所有环境变量。 - 依赖安装问题:部分运行时需要的包被你装到了
devDependencies里,Heroku生产环境默认不会安装devDependencies,启动时会报Cannot find module xxx错误;另外不要把本地的node_modules文件夹提交到git,会导致平台二进制依赖不兼容。 - 路径配置错误:确认
Procfile首字母大写、无后缀,放在项目根目录;如果你的server.js不在根目录(比如在src文件夹下),要把Procfile内容改成对应路径,比如web: node src/server.js。同时确认package.json里存在start脚本:"scripts": { "start": "node server.js" } - Node版本不兼容:如果本地用的Node版本和Heroku默认版本差过大,会出现语法不兼容报错,可以在
package.json里加engines字段指定和本地一致的大版本:"engines": { "node": "16.x" } - 数据库白名单问题:如果用MongoDB Atlas这类云数据库,要把Heroku的出口IP加到数据库白名单,测试阶段可以临时开
0.0.0.0/0允许所有IP连接,排除网络拦截问题。 - 端口硬编码:你当前的端口写法是对的,绝对不能把监听端口写死成3000,必须优先读取Heroku动态分配的
process.env.PORT。
补完异常捕获后看具体错误栈是最快的排查方式,不要瞎猜问题,Node进程退出前打出来的错误信息会直接告诉你根因。
内容的提问来源于stack exchange,提问作者pomoworko.com
相关产品推荐
相关产品推荐

