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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:22:42