VSCode调试Fastify必须显式启用V8 Inspector并使用attach模式,即启动命令加node --inspect=0.0.0.0:9229或fastify start -w --inspect=0.0.0.0:9229,同时launch.json中配置"request": "attach"、"port": 9229及精准匹配的"outFiles"路径,三者缺一不可。

VSCode 里跑 Fastify 微服务,不是装完插件点一下就能断点的——node --inspect=0.0.0.0:9229 这条命令漏掉,调试就等于没开;launch.json 里写 "request": "attach" 而不是 "launch",否则热重载一重启,断点全失效。
Node.js 环境必须验证 node -v 和 npm -v 可用
别跳过这步。Fastify 是纯 Node.js 库,不依赖任何 IDE 插件。如果终端里输 node -v 报 “command not found”,说明 PATH 没配好,VSCode 内置终端也照样跑不了 node。
- Windows 用户检查系统环境变量里的
Path是否包含 Node.js 安装目录(如C:\Program Files\nodejs\) - macOS / Linux 用户确认
which node有输出,且~/.zshrc或~/.bash_profile里加了export PATH="/usr/local/bin:$PATH"类似语句 - VSCode 启动前要关掉再重开,否则它读不到新 PATH(尤其 macOS GUI 启动的 VSCode)
fastify start CLI 必须带 --inspect=0.0.0.0:9229 才能连上 VSCode
很多人用 fastify start -w src/index.ts 觉得方便,但默认不启用调试通道。VSCode 断点静默跳过,不是代码问题,是根本没连上 V8 Inspector。
- 正确启动命令:
fastify start -w --inspect=0.0.0.0:9229 -l info src/index.ts - 别写成
--inspect或--inspect=localhost:9229:WSL、Docker、远程开发时localhost会让 VSCode 连不上进程 - 如果用
ts-node直接运行,改用:node --inspect=0.0.0.0:9229 -r ts-node/register/transpile-only src/index.ts - 确保
tsconfig.json开启了"sourceMap": true,否则 TypeScript 断点打不进源码
launch.json 必须用 attach 模式,且 port、outFiles 三者严丝合缝
Fastify 启动太快,launch 模式经常来不及 attach 就执行完了。用 attach 是唯一稳定方案,但配置错一个字符,断点就失效。
-
"request": "attach"—— 不是"launch" -
"port": 9229—— 必须和启动命令里--inspect=:9229的端口完全一致(常见填错为 9228、9230) -
"outFiles": ["${workspaceFolder}/dist/**/*.js"]—— TypeScript 编译后路径,不能写成**/*.js或./dist/**/*.js(./在 Windows 下会出错) -
"sourceMaps": true是开关,但真正起作用的是outFiles是否精准匹配 JS 输出位置 - 加
"restart": true,这样 nodemon / ts-node-dev 重启后 VSCode 自动重连
Schema 验证逻辑的断点要打在 preValidation 钩子里
Fastify 的 Schema 校验发生在请求进入 handler 前。如果你在 handler 函数里打断点想看校验失败的 error,大概率停不住——因为 400 响应已经发回去了,根本不会进 handler。
- 想调试校验过程,断点必须放在
preValidation钩子中:fastify.addHook('preValidation', (req, reply, done) => { /* 这里打点 */ }) - 或者用
onRequest钩子,也能看到原始请求体,但校验还没发生 - 别指望在
schema对象字面量里打点——那是静态定义,不执行 - Fastify 内部用
ajv编译 schema,断点进不去,只能从钩子层切入
最常被忽略的其实是三件事:启动命令没加 --inspect=0.0.0.0:9229、launch.json 里用了 launch 而不是 attach、outFiles 路径和实际编译输出对不上。这三个点任意一个错,断点就形同虚设。


















