Node.js应用部署Heroku后出现H10崩溃与R10启动超时问题求助
Node.js部署Heroku出现H10(App crashed)和R10(Boot timeout)错误解决方法
错误分析
从你提供的Heroku日志来看:
- R10错误:Web进程在启动后60秒内未绑定到Heroku分配的
$PORT环境变量指定的端口,这是启动超时的直接触发原因 - H10错误:应用崩溃,本质是启动过程中出现未捕获的异常,导致进程直接退出
问题根源
你的代码中mongoose.connect未处理连接成功/失败的回调逻辑:
- 若数据库连接失败,会抛出未捕获的异常直接终止进程,触发H10错误
- 若数据库连接耗时超过60秒,Heroku会判定启动超时,触发R10错误
虽然你已正确使用process.env.PORT || 5000绑定端口,但数据库连接的异常会打断正常启动流程,最终导致服务部署失败。
修复步骤
1. 调整数据库连接与服务器启动顺序
将服务器启动逻辑放在数据库连接成功的回调中,确保服务仅在数据库连接正常后启动,同时捕获连接错误避免进程崩溃:
修改后的代码:
import express from 'express'; import bodyParser from 'body-parser'; import mongoose from 'mongoose'; import cors from 'cors'; import dotenv from 'dotenv'; import postRoutes from './routes/posts.js'; const app = express(); dotenv.config(); app.use(bodyParser.json({ limit: "30mb", extended: true })); app.use(bodyParser.urlencoded({ limit: "30mb", extended: true })); app.use(cors()); app.use('/posts', postRoutes); app.get('/', (req, res) => { res.send('Hello to Decode API'); }); const PORT = process.env.PORT || 5000; // 先完成数据库连接,成功后再启动服务器 mongoose.connect(process.env.CONNECTION_URL, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { app.listen(PORT, () => console.log(`Server running on port ${PORT} and connected to database`)); }) .catch((err) => { console.error('Database connection error:', err.message); // 数据库连接失败时主动退出进程,避免Heroku反复重启 process.exit(1); }); // mongoose.set('useFindAndModify', false);
2. 验证Heroku环境变量配置
确保你已在Heroku应用中配置好CONNECTION_URL环境变量:
- 登录Heroku控制台进入目标应用
- 切换到「Settings」标签页,找到「Config Vars」区域
- 添加
CONNECTION_URL,值为你的MongoDB连接字符串(与本地.env文件中的内容一致)
3. 检查package.json核心配置
- 确保包含
start启动脚本:"scripts": { "start": "node index.js" } - 由于代码使用了ES模块的
import语法,需在package.json中添加:"type": "module"
验证修复
部署修改后的代码到Heroku,通过以下命令实时查看日志确认启动状态:
heroku logs --tail
若日志中出现Server running on port XXXX and connected to database的提示,说明服务已正常启动。
内容的提问来源于stack exchange,提问作者okunade femi joel
相关产品推荐
相关产品推荐

