Node+TS+Express+Socket.IO部署Heroku后闲置崩溃(错误码H10)
解决Heroku上Node/TS/Express/Socket.IO应用闲置后崩溃(H10错误)
可能原因及对应解决方案
1. 端口配置错误
Heroku采用动态端口分配,硬编码固定端口会导致闲置重启时端口冲突,直接引发崩溃。
- 修复代码:
const PORT = process.env.PORT || 3000; const httpServer = app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); // Socket.IO需绑定到创建好的HTTP服务器 const io = require('socket.io')(httpServer);
2. 外部连接未处理重连
应用休眠时,数据库、Redis等外部连接会断开,重启时若未重新建立连接,会因连接失败崩溃。
- 解决方案:
- 为数据库连接配置连接池及自动重连参数;
- 在Socket.IO连接事件中添加连接状态检查,异常触发重连;
- 避免启动时建立一次性连接,改为按需建立或添加心跳检测。
3. TypeScript编译配置问题
若TS未正确编译为JS,或编译输出路径配置错误,Heroku重启时找不到入口文件会崩溃。
- 检查
package.json脚本:
"scripts": { "build": "tsc", "start": "node dist/index.js" }
- 确保
tsconfig.json中outDir指向正确的编译输出目录,Heroku会自动执行build脚本完成编译。
4. Socket.IO传输超时
日志显示请求使用polling传输,闲置恢复时超时可能触发崩溃。
- 调整Socket.IO配置,优先使用WebSocket并增加超时阈值:
const io = require('socket.io')(httpServer, { transports: ['websocket', 'polling'], pingTimeout: 60000, pingInterval: 25000 });
5. 休眠唤醒缺少初始化逻辑
应用从休眠唤醒时,未执行依赖服务初始化(如重新加载配置、建立连接),会导致启动失败。
- 在应用启动流程中添加初始化检查,确保所有依赖服务连接正常后再监听请求。
排查技巧
执行heroku logs --tail实时查看崩溃时的详细错误栈,H10仅为表面错误,后续的具体异常信息(如未捕获错误、模块缺失)才是定位问题的关键。
内容的提问来源于stack exchange,提问作者Bcwin i
相关产品推荐
相关产品推荐

