VSCode调试Express需显式启用V8 Inspector:启动脚本加--inspect-brk,launch.json配runtimeExecutable和env,WSL需绑定0.0.0.0并配置端口映射。

Express 启动脚本没加 --inspect,断点永远不生效
VSCode 调试 Express 本质是连接 Node.js 的 V8 Inspector,不是靠“自动识别项目类型”。如果启动命令还是 node app.js 或 npm start(背后没启用调试协议),VSCode 就连不上调试器。
实操建议:
- 检查
package.json的start脚本:改成node --inspect-brk=9229 app.js(--inspect-brk表示启动即暂停,方便在第一行设断点) - 如果用
nodemon,得加-e js,json和--inspect-brk:例如nodemon --inspect-brk=9229 -e js,json app.js - 端口
9229是默认值,可改,但必须和launch.json里一致;Windows 上偶尔被 IIS 占用,可换9230 - 启动后终端要显示类似
Debugger listening on ws://127.0.0.1:9229/...才算成功
launch.json 的 runtimeExecutable 和 env 配置错,直接报错或环境变量丢失
很多人以为 VSCode 能自动推导 Node 路径或继承终端环境,其实不会。尤其在多版本 Node(nvm / fnm)、WSL、或全局安装了 nodemon 的场景下,路径一错就 Cannot find runtime 'node' 或 process.env.PORT 是 undefined。
实操建议:
- 显式指定
runtimeExecutable:比如"runtimeExecutable": "/usr/local/bin/node"(macOS/Linux)或"runtimeExecutable": "C:\Program Files\nodejs\node.exe"(Windows) - 用
which node(macOS/Linux)或where node(Windows)确认真实路径 - 需要环境变量(如
NODE_ENV=development)时,必须写进env字段:"env": { "NODE_ENV": "development", "PORT": "3000" },不能只靠终端 export - 如果用
nodemon启动,runtimeExecutable应设为nodemon路径,且program改成app.js,再通过args传参
断点打在 app.get() 回调里却跳过,其实是 Express 异步加载或路由未命中
常见现象:在 app.get('/user', (req, res) => { ... }) 里打了断点,但发请求后完全不触发。不是调试配置问题,而是请求根本没走到这个路由。
实操建议:
- 先确认请求 URL 完全匹配:比如 Express 默认不处理带后缀的路径,
/user.json不会命中/user - 检查中间件顺序:如果
app.use(express.json())写在app.get()后面,不影响断点,但如果用了自定义中间件并return或next('route'),可能跳过后续路由 - 动态路由参数(如
/user/:id)要确保 URL 中有对应值,/user/(结尾多斜杠)可能因严格模式不匹配 - 断点优先打在
app.listen()后面一行,确认服务确实跑起来了;再打在app.get()外层,看是否执行到该路由注册逻辑
WSL 或远程开发时,localhost 端口映射失败,调试器连不上
在 WSL2 或 Remote-SSH 下,--inspect 默认绑定 127.0.0.1,而 VSCode 的调试客户端运行在 Windows/macOS 主机上,无法直连 WSL 的 localhost。
实操建议:
- 把
--inspect-brk改成--inspect-brk=0.0.0.0:9229(注意不是*) - 确保 WSL 的防火墙允许该端口(
sudo ufw allow 9229) - VSCode 的
launch.json中address字段要设为 WSL 的 IP(如172.xx.xx.1),或更简单:用"address": "localhost"+ 端口转发(Windows 上需在 WSL 中运行echo $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')查主机 IP) - Remote-SSH 场景下,推荐直接在远程机器上装 VSCode Server,用本地 VSCode 连接——这样
localhost指向的就是远端,无需额外映射
next(err))、以及 res.send() 后再写响应这些细节,VSCode 断点看不到,得靠日志或 console.log 配合。


















