VS Code调试Node.js服务器最稳定方式是node --inspect启动后attach,需配对launch.json端口;直接launch易因路径、环境变量或sourcemap配置错误导致断点失效。
vs code 调试 node.js 服务器不需要装插件也能跑起来,但必须配对 launch.json 和启动方式,否则断点不生效、进程自动退出、console.log 看不到输出都是常见现象。
用 node --inspect 启动服务再 attach
这是最稳定、兼容性最好的方式,尤其适合 Express/Koa/Nest 等框架启动较慢或带 CLI 参数的场景。VS Code 不接管进程生命周期,只“附着”上去调试。
- 终端里手动运行:
node --inspect=9229 ./bin/www(假设你的入口是./bin/www) - VS Code 中按
Ctrl+Shift+D打开调试面板,点击左上角齿轮图标生成.vscode/launch.json,选Node.js: Attach to Process - 确保
port和启动命令一致(默认9229),保存后点击绿色 ▶ 启动 attach - 注意:如果服务启动后立刻退出(比如没监听端口),
--inspect会失效——加--inspect-brk可在第一行暂停,等你设好断点再继续
launch.json 直接 launch 时的路径和环境陷阱
选 Node.js: Launch Program 模板看似简单,但 program、cwd、env 配错会导致模块找不到、process.env 为空、require('./config') 报错。
-
"program": "${workspaceFolder}/app.js"—— 必须写绝对路径,${workspaceFolder}是安全写法;别用./app.js -
"cwd": "${workspaceFolder}"—— 控制工作目录,影响require()解析和fs.readFile('./data.json') - 需要环境变量?直接加:
"env": { "NODE_ENV": "development", "PORT": "3001" },别依赖 .env 文件(除非你自己用dotenv加载) - 如果用
ts-node或nodemon,不能直接填进program;得用runtimeExecutable指定解释器
断点不命中?检查这三个地方
不是代码问题,大概率是 sourcemap、文件映射或 VS Code 缓存导致的假象。
- TS/JSX 项目必须生成
.map文件:TS 编译时加"sourceMap": true,且outDir和rootDir对齐 - 调试时看到的是编译后 JS,但断点打在 TS 上——确认
launch.json里有"sourceMaps": true和"outFiles": ["${workspaceFolder}/dist/**/*.js"] - 改了
launch.json或代码后没重启调试会话?VS Code 不自动重载配置,必须停掉再点 ▶ - Express 路由里断点不触发?先确认请求真发到了这个路由(看终端日志或加
console.log('hit')),再检查是否用了router.use()顺序错位
最麻烦的其实是异步链路:Promise.then()、async/await、中间件嵌套多层后,堆栈跳转快,断点容易“跳过”。这时候别只盯着一行代码,打开调试面板的 “Call Stack” 和 “Loaded Scripts”,看当前执行位置到底落在哪一层文件里。










