vscode调试node.js失败90%因launch.json配置错误、node不在path或sourcemap未映射;需明确type为"node"、request为"launch"/"attach",program指向可执行js文件,path一致且node≥14,ts项目配sourcemaps、outfiles及resolvesourcemaplocations。

VSCode 调试 Node.js 不需要额外装插件,但 launch.json 配错、node 命令不在 VSCode 的 PATH 里、或 TypeScript 的 source map 没对上,断点就永远不生效——这三类问题覆盖了 90% 的失败场景。
断点点了没反应?先看 type 和 request 填对没
VSCode 不会自动猜你要调试什么。必须在 launch.json 里明确写:
-
type固定为"node"(别手写"pwa-node",老项目或 CI 场景下容易 fallback 失败) -
request只能是"launch"(自己启动进程)或"attach"(连已运行的进程),漏掉任一字段,配置静默失效 -
request: "launch"时,program必须指向一个真实存在的、可被 Node 直接执行的.js文件(比如"${workspaceFolder}/dist/index.js"),不能是npm start或ts-node命令
node 找不到或报版本错?PATH 和启动方式必须对齐
你在终端能跑 node -v,不代表 VSCode 调试器能用它——尤其 macOS/Linux 下用 zsh 启动 VSCode 时,它可能根本没继承 shell 的 PATH。
- 在 VSCode 内置终端(
Ctrl + `)里执行node -v,失败就说明环境没接上 - 查真实路径:
which node(macOS/Linux)或where node(Windows),比如输出/opt/homebrew/bin/node - 在项目根目录的
.vscode/settings.json里显式注入 PATH:"terminal.integrated.env.osx": { "PATH": "/opt/homebrew/bin:${env:PATH}" } - 改完必须彻底退出 VSCode 并重启,否则环境变量不刷新
- 确认 Node 版本 ≥ 14:低于这个版本,
async_hooks等底层机制不支持,异步调用栈挂不起
TypeScript 断点停在 .js 里?sourceMap 链路断了
VSCode 不会自动读 tsconfig.json 里的 "sourceMap": true,必须在 launch.json 中双重确认源码映射是否可达。
- 编译时确保生成了
.map文件:tsc --sourceMap或tsconfig.json中设"sourceMap": true -
launch.json中加"sourceMaps": true和"outFiles": ["./dist/**/*.js"],告诉调试器去哪找产物 - 如果
.ts文件不在根目录(比如在packages/foo/src),还要加"resolveSourceMapLocations"显式放行:["${workspaceFolder}/packages/**/src/**", "!**/node_modules/**"] - 不配
outFiles,VSCode 就不知道该把dist/index.js的哪一行映射回src/index.ts—— 断点只能停在 JS 上
Express/Koa 服务一调试就卡住?别硬启,优先用 attach 模式
用 launch 模式直接起服务,容易和环境变量、子进程、端口监听冲突。生产级调试应默认走 attach。
- 先在终端手动跑:
node --inspect-brk ./bin/www(停在第一行,留出连接窗口) -
launch.json关键项:"type": "node"、"request": "attach"、"port": 9229 - 如果用了自定义端口,比如
--inspect=9230,port值必须同步改,否则连不上 - 别同时起两个
--inspect进程——端口冲突会导致第二个报Starting inspector on 127.0.0.1:9229 failed: address already in use - 如果用了
nodemon,别把program写成nodemon index.js;它是 wrapper,VSCode 的node调试器无法直接 attach 到它启动的子进程
最常被忽略的是:断点能否命中,不只取决于配置是否“看起来对”,更取决于请求是否真的走到那行代码——比如中间件提前 return、body-parser 解析失败、或 program 指向的压根不是实际启动的文件。











