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

如何在Heroku部署MERN应用?运行5-10分钟报H10错误崩溃如何解决

Heroku部署MERN应用运行5-10分钟触发H10错误(进程退出状态码1)排查修复

你当前贴的日志只有进程崩溃的结果记录,没有崩溃前的错误上下文,按以下步骤从高频到低频逐一排查即可:

第一步:先拿到完整错误上下文

不要只看崩溃触发的两条结果日志,先拿全量报错信息定位根因:

  • 实时拉取应用运行日志,等问题复现时直接看崩溃前最后抛出的错误栈:heroku logs --tail -a <你的Heroku应用名称>
  • 本地切生产模式启动服务,连续压测10分钟以上复现问题:NODE_ENV=production node <你的服务入口文件,通常是server.js/app.js/index.js>

高频问题对应修复方案

1. Clever Cloud MongoDB连接保活配置缺失

这是你当前架构下最高频的触发原因:Clever Cloud会主动回收空闲超过5分钟的TCP连接,如果你Mongoose连接没开心跳保活、没做连接异常捕获,连接被回收时抛出的未捕获错误会直接让Node进程以状态码1退出,刚好匹配5-10分钟崩溃的时间特征。
修复方式:调整Mongoose连接配置,加心跳保活和全局连接异常捕获:

const mongoose = require('mongoose')
mongoose.connect(process.env.MONGO_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  serverSelectionTimeoutMS: 5000,
  heartbeatFrequencyMS: 10000, // 每10秒发送心跳维持连接
  socketTimeoutMS: 45000,
})
// 捕获连接层异常,避免异常直接击穿进程
mongoose.connection.on('error', err => {
  console.error('MongoDB连接异常:', err)
})

同时登录Clever Cloud控制台检查数据库实例状态:如果连接数打满、CPU/内存跑满,也会主动踢掉客户端连接,对应升级实例规格或者优化连接池配置即可。

2. 未捕获的全局异常/未处理Promise rejection直接触发进程退出

Node.js默认行为是遇到未捕获的异常、没有写catch的Promise reject时,直接以状态码1退出进程。5-10分钟才触发的崩溃,通常是延迟执行的逻辑(比如定时任务、异步上报、长耗时接口的回调)抛错没有被捕获导致。
修复方式:在服务入口文件的最顶部加全局异常捕获,先把错误栈打出来定位具体问题,同时避免进程直接崩溃:

// 放在所有业务逻辑引入之前
process.on('uncaughtException', err => {
  console.error('全局未捕获异常:', err)
})
process.on('unhandledRejection', err => {
  console.error('未处理的Promise异常:', err)
})

加完配置重新部署,等问题复现时看日志里打印的具体错误栈,直接修复对应报错的业务代码即可。

3. 端口硬编码导致健康检查失败

不要在代码里硬编码Node服务的监听端口,必须读取Heroku动态分配的PORT环境变量。如果硬编码写死比如3000端口,Heroku的健康检查组件在服务启动后几分钟内探测不到绑定端口的响应,会强制判定服务异常,触发进程重启、H10报错。
错误写法:

app.listen(3000) // 硬编码端口

正确写法:

const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
  console.log(`服务运行在端口${PORT}`)
})

4. 内存超限被系统强制终止

Heroku免费版、基础版dyno的内存上限是512M,如果代码存在内存泄漏,跑5-10分钟内存占用触达阈值时,会被Heroku底层直接杀掉进程,对应状态码1退出。可以直接在Heroku控制台的Metrics面板看崩溃前的内存使用率曲线,如果崩溃前内存冲到配额上限,逐一排查:

  • 是否把前端打包的sourcemap、大体积静态资源都加载到了Node服务内存里
  • 接口逻辑里是否存在未释放的大对象、闭包引用、无限循环的监听器
  • 是否引入了有内存泄漏问题的第三方依赖包

验证步骤

改完上述配置后重新部署:git push heroku main
保持日志追踪窗口打开,连续模拟用户访问15分钟以上,确认进程状态保持为up、日志里没有持续报错即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:36:27