VSCode调试Node.js时unhandledRejection导致进程瞬间退出,因Node.js默认直接exit(1)且不等待调试器挂载,真正线索藏于Output面板的Node.js Debug Adapter日志中,需配置"nodeOptions": ["--unhandled-rejections=strict"]才能捕获。

VSCode 调试 Node.js 时程序因 unhandledRejection 退出,不是代码没写 catch 那么简单——默认行为是进程直接终止,且调试器往往来不及捕获堆栈,Debug Console 空白,真正线索藏在 Output 面板的 Node.js Debug Adapter 日志里。
为什么 unhandledRejection 会让调试瞬间退出?
Node.js 默认对未处理的 Promise 拒绝(unhandledRejection)触发 process.exit(1),且不等待事件循环清空。VSCode 的调试器还没来得及挂载上下文或输出错误,进程就已销毁。
这导致:
- Debug Console 显示 “未连接” 或完全空白
- 断点根本不会触发(连第一行都可能没走到)
- 错误堆栈不会出现在调用栈面板,只留在底层日志中
必须检查 Output 面板里的 Node.js Debug Adapter 日志
打开 Output 面板(Ctrl+Shift+U),从下拉菜单选 Node.js Debug Adapter,搜索以下关键词:
-
unhandledRejection—— 直接定位拒绝源头,常附带reason和stack -
Promise rejection—— 有时日志用词更宽泛 -
exit code: 1—— 结合时间戳往前翻,找紧邻的拒绝信息
常见真实报错示例:Uncaught (in promise) Error: connect ECONNREFUSED 127.0.0.1:5432UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'data' of undefined
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
launch.json 中要加 nodeOptions 才能捕获拒绝
仅靠 stopOnEntry: true 或异常断点无法拦截 unhandledRejection —— 它不属于传统“异常”,而是独立事件。必须显式启用 Node.js 的拒绝钩子:
- 在
launch.json的配置项里加:"nodeOptions": ["--unhandled-rejections=strict"] - 该参数让 Node.js 把未处理拒绝当作致命错误,强制抛出并触发调试器暂停
- 不加这个,VSCode 默认忽略拒绝事件,进程静默退出
- 注意:Node.js ≥ 15 才支持
--unhandled-rejections=strict;低于此版本需用--throw-deprecation+ 监听process.on('unhandledRejection')手动打点
如何临时补救已存在的 unhandledRejection?
如果暂时不能改 launch.json 或升级 Node,可在入口文件顶部快速注入监听,把拒绝转为可捕获异常:
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// 强制抛出,让调试器能捕获
throw reason;
});但要注意:
- 这会改变原有行为(原本退出,现在崩溃)
- throw reason 可能被外层 try/catch 吞掉,不如 --unhandled-rejections=strict 可靠
- 生产环境禁用此写法,仅用于本地调试定位
最易被忽略的点:即使你写了 try/catch,async/await 里漏掉 await、或 Promise 链末端没加 .catch(),照样触发 unhandledRejection —— 日志里看到的堆栈,往往指向那个“没被 await 的 Promise”,而不是你认为的业务代码行。

















