You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS Express部署Heroku出现H10 App crashed错误问题排查

Heroku部署Node-Express服务H10崩溃故障修复方案

核心故障诱因

最直接导致启动崩溃的是代码中的未定义变量引用错误,其次是数据库配置不符合Heroku ClearDB插件的使用规则,两个问题叠加导致应用进程启动即退出,触发H10 App crashed报错,单纯重启应用无法解决代码层面的错误。

具体问题点与修复步骤

1. 修复致命启动错误:PORT变量未定义

你的index.js中listen监听逻辑存在变量未定义问题:

// 原错误代码
app.listen(process.env.PORT || 80, () => console.log(`running on port ${PORT}`))

代码中从未定义PORT变量,直接在日志输出中引用会直接抛出ReferenceError: PORT is not defined,Node进程启动瞬间就会退出,这是H10报错的核心原因。
修复为:

// 先定义PORT变量再使用
const PORT = process.env.PORT || 80;
app.listen(PORT, () => console.log(`running on port ${PORT}`))

2. 修正ClearDB数据库连接配置

你当前数据库配置写死了private占位值,且没有使用Heroku ClearDB插件自动注入的环境变量,就算解决了PORT的问题,也会因为数据库连接失败导致服务异常。
ClearDB插件会自动将连接信息存在CLEARDB_DATABASE_URL环境变量中,不需要手动硬编码host、账号、密码信息,按如下方式修改数据库配置:

  • 首先在index.js顶部引入url解析模块:
const url = require('url');
  • 替换原有的硬编码数据库连接池配置:
// 自动适配Heroku ClearDB和本地开发环境
const dbConfig = process.env.CLEARDB_DATABASE_URL ? (() => {
  const connParams = url.parse(process.env.CLEARDB_DATABASE_URL);
  const authInfo = connParams.auth.split(':');
  return {
    host: connParams.hostname,
    user: authInfo[0],
    password: authInfo[1],
    database: connParams.pathname.split('/')[1],
    connectionLimit: 10
  };
})() : {
  // 本地开发环境的数据库配置写在这里
  host: '127.0.0.1',
  user: '你的本地数据库账号',
  password: '你的本地数据库密码',
  database: '你的本地库名'
};
const db = mysql.createPool(dbConfig);

3. 可选优化:补全根路由、调整依赖配置

  • 当前没有配置根路径/的路由,服务正常启动后访问根地址会返回404,可以加一个简单的健康检查路由:
app.get('/', (req, res) => {
  res.send('service is running');
});
  • 将开发依赖nodemon从dependencies移到devDependencies,减少部署包体积,修改后的package.json依赖部分参考:
{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "devStart": "nodemon index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.20.0",
    "cors": "^2.8.5",
    "express": "^4.18.1",
    "express-fileupload": "^1.4.0",
    "mysql": "^2.18.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.16"
  }
}
  • 代码中引入了但未使用的fs模块、未挂载的express-fileupload包如果不需要可以直接删除,避免冗余。

部署验证步骤

  1. 本地先执行npm start,确认本地启动无报错,能正常输出端口监听日志、接口访问正常
  2. 将修改后的代码提交到Git,推送到Heroku远程仓库:
git add .
git commit -m "fix: resolve startup error and update cleardb config"
git push heroku main
  1. 部署完成后执行heroku logs --tail查看实时运行日志,看到running on port xxxx的日志即表示启动成功,不会再触发H10报错。

注意:heroku restart仅能重启正常的应用进程,无法修复代码本身的语法错误、逻辑错误,代码问题导致的崩溃必须修改代码后重新部署才能解决。

内容的提问来源于stack exchange,提问作者Ads

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:09:21