NodeJS Express应用运行一段时间后崩溃,如何实现服务持续稳定运行?
你遇到的ECONNRESET错误是TCP连接被远程端异常中断导致的,NodeJS进程默认遇到未捕获的错误会直接退出,nodemon仅监听文件变更触发重启,不会处理运行时的未捕获异常,所以无法解决问题。
1. 全局捕获异常避免进程直接崩溃
在你的app.js入口文件最顶部添加全局异常监听代码:
// 捕获同步未处理异常 process.on('uncaughtException', (err) => { console.error('未捕获的异常:', err) // 非致命错误可以继续运行,致命错误建议记录日志后退出,由进程管理工具自动重启 if (!err.fatal) return // 退出前可执行优雅关闭逻辑:关闭数据库连接、清理临时资源等 process.exit(1) }) // 捕获异步Promise未处理的拒绝 process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', reason) })
如果你的服务内部有主动发起第三方HTTP请求、数据库连接等操作,也要给对应的连接/请求对象添加error事件监听,避免错误冒泡到全局。
2. 用进程管理工具做兜底自动重启
用pm2替代直接用node或者nodemon启动服务,pm2会监控进程状态,遇到异常退出自动重启,还支持日志管理、负载均衡等能力:
- 安装pm2:
npm install pm2 -g - 启动服务:
pm2 start app.js --name "你的服务名" - 查看服务状态:
pm2 list - 查看运行日志:
pm2 logs 你的服务名 - 配置开机自启:执行
pm2 startup按照提示操作即可,后续服务崩溃、服务器重启都会自动拉起服务
3. 根因排查建议
兜底方案只能保证服务可用,你还可以通过以下方式定位触发错误的根源:
- 给所有对外请求添加超时时间,避免长时间空闲连接被服务器主动断开
- 完善请求日志,记录每次对外请求的地址、参数、返回状态,定位触发
ECONNRESET的具体交互对象 - 检查数据库、Redis等长连接的配置,是否有心跳检测、断开自动重连的逻辑,避免长连接超时被服务端重置
内容的提问来源于stack exchange,提问作者Utkrisht Agrawal
相关产品推荐
相关产品推荐

