如何在Node.js遇UNHANDLED REJECTION/UNCAUGHT EXCEPTION时关闭服务器?
Node.js 实现未处理异常时彻底关闭服务器(类似Laravel行为)
你当前的代码逻辑是对的,但服务器看起来没关闭,核心原因是你用了nodemon——它的默认行为是在进程崩溃退出后自动重启应用,所以才会看到[nodemon] app crashed - waiting for file changes before starting...的提示,并非服务器没关闭。
解决办法
1. 测试阶段直接用node启动(不用nodemon)
如果只是验证异常关闭的行为,直接用原生node命令启动项目:
node server.js
触发未处理异常后,进程会彻底退出,不会自动重启,和Laravel的行为完全一致。
2. 保留nodemon但禁止崩溃后重启
如果需要继续用nodemon开发,但希望异常时彻底关闭不重启:
- 方式一:修改nodemon配置
在项目根目录创建nodemon.json文件,添加如下配置:
{ "exitcrash": true }
启动时依然用nodemon server.js,触发异常后nodemon会直接退出,不再自动重启应用。
- 方式二:优化异常处理器的退出逻辑
在关闭服务器后再强制退出进程,确保nodemon能正确识别崩溃状态:
process.on('uncaughtException', (err) => { console.log('UNCAUGHT EXCEPTION! 😑 Shutting down... 🚅 🤯'); console.log(err.name, err.message); // 先优雅关闭服务器,再退出进程 server.close(() => { process.exit(1); }); // 5秒后强制退出,防止server.close阻塞 setTimeout(() => process.exit(1), 5000); });
3. 补充:处理异步未处理异常
Node.js中uncaughtException只能捕获同步异常,对于Promise未处理的拒绝(异步异常),需要额外监听unhandledRejection:
process.on('unhandledRejection', (err) => { console.log('UNHANDLED REJECTION! 😑 Shutting down...'); console.log(err.name, err.message); server.close(() => { process.exit(1); }); });
内容的提问来源于stack exchange,提问作者phpdev_lakmal
相关产品推荐
相关产品推荐

