先确认是否被PowerShell策略拦截:运行Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned -Force解除限制;再检查VSCode终端PATH是否真实生效,需手动补路径并彻底关闭VSCode;有堆栈一闪而过则配置launch.json中"console": "integratedTerminal"并启用Uncaught Promise Rejections断点。

终端里 node app.js 崩溃但没堆栈?先确认是否被 PowerShell 策略拦截
PowerShell 默认禁止执行本地脚本,node app.js 报错“无法识别为 cmdlet”或直接静默退出,大概率不是代码问题,而是策略阻止了 Node 进程启动。运行 Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned -Force 解除当前终端限制,再试一次。
- 别信系统 PATH 已设置——VSCode 终端不继承 nvm 或安装向导写入的路径,必须手动补
$env:Path += ";C:\nodejs"(Windows)或检查terminal.integrated.env.osx(macOS) - 用
where node(Windows)或which node(macOS/Linux)验证路径是否真实可用,别只看安装界面勾选了 Add to PATH - 改完环境变量后必须彻底关闭 VSCode(包括托盘进程),否则新 PATH 不生效
有堆栈但一闪而过?强制输出到集成终端并禁用调试器拦截
VSCode 调试器默认会捕获未捕获异常并中断,但你在终端里直接运行 node app.js 时,它不参与——所以崩溃时堆栈可能被清屏、被其他日志覆盖,或只在外部终端弹出。要稳定看到完整错误,得让输出走 VSCode 自己的终端:
- 在
.vscode/launch.json中添加"console": "integratedTerminal",然后按 F5 启动(不是 Ctrl+F5) - 如果仍看不到堆栈,加
"trace": true和"outputCapture": "std",确保 stderr 不被吞掉 - 避免在
process.on('uncaughtException')里调用console.log后立刻process.exit()——Node 16+ 会截断部分堆栈,改用console.error(err)+setTimeout(() => process.exit(1), 0)
堆栈指向 node_modules 但断点不命中?skipFiles 没放行依赖包
你看到 at node_modules/axios/lib/core/dispatchRequest.js:52:11,但打的断点是空心圆,hover 提示 “breakpoint ignored”,说明 VSCode 默认跳过了 node_modules。这不是源码问题,是调试配置屏蔽了它:
- 删掉
launch.json里的"skipFiles": ["**/node_modules/**"],或者改成"skipFiles": ["(只跳过 Node 内部)/**"] - 更安全的做法:保留跳过大部分,只放行你要查的包,比如
"!**/node_modules/axios/**"—— 注意!开头才表示“不跳过” - 如果依赖包没提供
.map文件(绝大多数 npm 包都不提供),断点只能停在编译后代码(如lib/index.js),别指望跳转到 TypeScript 源码
Promise.reject() 导致崩溃却没中断?Uncaught Promise Rejections 断点没开
UnhandledPromiseRejectionWarning 出现在控制台,但程序直接退出、没停在 reject(new Error()) 那行——这不是代码漏写 .catch(),而是 VSCode 根本没监听这类异常。Node.js 调试器把同步抛错和 Promise 拒绝当成两套独立机制:
- 必须在「运行和调试」面板 → 「断点」区域点击
+→ 选择Node.js: Uncaught Promise Rejections,且图标要是实心(灰色=未启用) -
Uncaught Exceptions和这个开关完全无关,勾了前者也救不了 Promise 崩溃 - 该断点只在 F5 启动调试模式下生效;终端里跑
node app.js永远不会触发它 - Remote-SSH 或 WSL 环境需确认 Node.js ≥ 12.0,旧版本不支持该协议
最易被忽略的是:VSCode 的 Node.js 调试器不读 launch.json 里的 exceptions 字段,所有异常断点行为都由 UI 面板里的勾选框决定。盯住那个实心图标,别信配置文件。











