VSCode调试Node.js失败主因是launch.json配置错误:program未指向可执行JS入口文件、路径未用${workspaceFolder}正确声明、Node未启用--inspect协议;断点不触发需先验证此三项。

VSCode 调试 Node.js 程序失败,90% 是因为 launch.json 没配对、program 路径写错,或 Node 进程根本没启用调试协议——不是插件问题,也不是 VSCode 本身坏了。
断点不触发?先确认 program 是否指向可执行的 JS 入口文件
VSCode 不会自动猜你要跑哪个文件。它只认 program 字段里那个路径,且该文件必须能被 node 直接执行(即不能是 .ts、.jsx 或 ESM 语法未转译的源码)。
-
program必须是相对于工作区根目录的**完整路径**,推荐用${workspaceFolder}/src/index.js,别写src/index.js或./src/index.js - 如果入口是
index.ts,别直接填进去——要么先用tsc编译出.js+.map,再把program指向dist/index.js;要么改用type: "pwa-node"配合runtimeArgs: ["-r", "ts-node/register", "src/index.ts"] - 用
npm start启动的项目,不要在launch.json里硬写program;改用runtimeExecutable指向node_modules/.bin/npm,再设args: ["start"] - 常见报错:
Cannot find module或ERR_INVALID_ARG_VALUE,说明program找不到或内容非法,调试器会静默退出,看起来像“点了 F5 没反应”
launch.json 中 request: "launch" 和 "attach" 怎么选
二者本质区别在于谁启动进程:launch 是 VSCode 起一个带 --inspect 的新 node 进程;attach 是 VSCode 去连一个**已经运行**且监听调试端口的进程。
- 本地脚本、CLI 工具、简单服务:用
request: "launch"最省事,配好program就行 - Express/Koa 等 Web 框架、依赖环境变量或端口复用的场景:优先用
attach模式。先终端执行node --inspect-brk ./bin/www(注意--inspect-brk会让它停在第一行),再在launch.json里配"port": 9229和"address": "localhost" - 端口不一致必失败:比如命令行用了
--inspect=3001,但launch.json里port还是9229,VSCode 就连不上 - Docker 容器内调试需额外设
"address": "0.0.0.0"并暴露对应端口,否则 localhost 连不通
TypeScript 项目断点停在 .js 文件上?sourceMaps 配置缺一不可
VSCode 默认不解析 .map 文件,断点打在 .ts 上却停在编译后的 .js 行,就是映射链断了。
- 确保
tsconfig.json里有"sourceMap": true,且"outDir"明确(如"dist") -
launch.json对应配置中必须加"sourceMaps": true和"outFiles": ["${workspaceFolder}/dist/**/*.js"] - 如果
.ts在子包里(如packages/foo/src),还得加"resolveSourceMapLocations": ["${workspaceFolder}/packages/**/src/**", "!**/node_modules/**"],不然 VSCode 不知道去哪找源码 - 断点是空心红圈?说明 source map 未加载成功——检查
outFiles路径是否真能匹配到生成的.js文件,大小写、斜杠方向都要一致
调试时看不到变量、process.env 为空、console.log 不输出?
这些不是断点问题,而是调试上下文没生效或输出被吞了。
-
env字段必须显式声明:在launch.json配置里加"env": {"NODE_ENV": "development"},否则process.env里只有系统默认变量 -
console输出默认进 Debug Console,但很多日志(尤其是框架启动日志)会刷屏太快。设"console": "integratedTerminal"才能在下方终端看到完整输出 - 想临时改变量值验证逻辑?在 Debug Console 里输入
let x = 42可以,但const y = 1会报错——Debug Console 支持修改let/var,不支持const - 第三方模块(如
node_modules/lodash)里打不了断点?默认被skipFiles跳过。要调试它,删掉或注释掉"skipFiles": ["<node_internals>/**"]</node_internals>,或改成"skipFiles": []
最易忽略的一点:VSCode 启动后不会自动继承 shell 的环境变量(尤其用 nvm 管理 Node 版本时)。如果 node -v 在终端能运行,但在 VSCode 里报 Cannot find runtime 'node',大概率是没从正确 shell 启动 VSCode —— Mac/Linux 下用终端执行 code .,Windows 下确认 Node 安装时勾选了 “Add to PATH”。


















