不能直接运行src/main.ts或main.js调试,因会绕过nest cli的启动机制,导致断点错位、环境变量丢失、不自动重启及argv参数失效;正确做法是用attach模式连接nest start --watch --debug启动的进程。

为什么不能直接运行 src/main.ts 或 main.js 调试
直接在 WebStorm 里选中 src/main.ts 点 Debug,大概率断点不命中、环境变量丢失、改代码不重启——这不是配置问题,而是 NestJS 启动逻辑被绕过了。Nest CLI(nest start)负责 TypeScript 编译、--watch 监听、.env 加载、process.argv 解析(比如 --config)、模块注册等关键流程。WebStorm 若跳过它直接执行 TS/JS 文件:
• ts-node 编译路径和 source map 映射错位,断点停在 dist/app.controller.js 而不是你写的 app.controller.ts
• NODE_ENV、APP_ENV 等变量未按 Nest 规则加载,ConfigModule 初始化失败
• 修改文件后不会触发重编译,必须手动停止再点 Debug 图标
• process.argv 为空,所有 CLI 参数(如 --watch)失效
正确做法:用 Attach to Node.js 配置连接已启动进程
让 WebStorm 做“监听者”,而不是“启动者”。所有编译、重启、环境注入都交给 nest CLI 完成,IDE 只管断点和变量观察。
• 终端执行:nest start --watch --debug=9229(端口可换,但需与下一步一致)
• WebStorm → Run → Edit Configurations → + → Attach to Node.js/Chrome
• Host 填 localhost,Port 填 9229(必须和命令中 --debug 值一致)
• “Auto-open in browser” 是可选项,不影响调试本身
• 点击 Debug 图标(甲虫)即可连接;此时修改任意 .ts 文件,--watch 自动重编译并重启进程,断点仍有效
npm script 方式可行但有隐藏陷阱
如果你的 package.json 里定义了 "start:debug": "nest start --debug --watch",可用 npm 类型配置,但必须避开一个关键坑:
• Run → Edit Configurations → + → npm
• Script 填 start:debug,CWD 设为项目根目录
• 关键:取消勾选 Node interpreter 区域下方的 Run with JavaScript debugger
• 勾选它 = WebStorm 尝试自己 launch 进程,又回到第一种失败模式;不勾选 = 它只执行 npm 命令,然后自动 attach 到暴露的调试端口
• 该方式稳定性略低于纯 Attach 模式,因 npm 启动过程多一层 wrapper,偶尔会延迟 attach 或 source map 加载失败
source map 不生效?三个地方必须同时满足
断点打在 app.controller.ts 却停在 dist/app.controller.js 里,说明 source map 没被识别或没生成:
• 确认 tsconfig.build.json 或 tsconfig.json 中有 "sourceMap": true
• 若用 nest build 构建,检查 dist/ 目录下是否存在对应 .js.map 文件
• WebStorm 的 TypeScript 设置中,Settings → Languages & Frameworks → TypeScript → Enable TypeScript compiler 必须开启(否则不生成 map)
• 注意:WebStorm 默认不启用内置 TS 编译器,这个开关常被忽略










