vscode调试adonisjs项目需同时满足esm模块加载、断点命中、sourcemap对齐及进程连接:launch.json须设"type":"node"、"program":"${workspacefolder}/bin/server.js"或build路径、"env":{"node_options":"--enable-source-maps"}、"cwd":"${workspacefolder}",ts项目加"runtimeargs":["--loader","ts-node/esm"],nodemon热重载必须用"request":"attach"模式。

VSCode 调试 AdonisJS 项目,核心不是装插件,而是让调试器能正确加载 ESM 模块、命中断点、读取 sourceMap 并连接到实际运行的进程——三者缺一不可。
AdonisJS 的 launch.json 必须设 "type": "module"
AdonisJS 5+ 默认是 ESM 项目,package.json 中有 "type": "module"。如果 launch.json 没显式声明,VSCode 会按 CommonJS 解析,所有 import 都报错,比如:
Cannot use import statement outside a module
正确写法必须包含:
-
"type": "node"(固定值,不是 "nodejs" 或 "adonis") -
"runtimeArgs": ["--loader", "ts-node/esm"](TS 项目才加;纯 JS 可省略) -
"env": {"NODE_OPTIONS": "--enable-source-maps"}(强制启用源映射,比仅靠sourceMap: true更可靠)
断点不触发?检查 program 是否指向编译后文件
VSCode 调试的是运行时的 JavaScript,不是 TypeScript 源码。即使你编辑 app/Controllers/Http/UserController.ts,断点也必须落在它编译后的 build/app/Controllers/Http/UserController.js 上。
常见错误配置:
-
"program": "${workspaceFolder}/src/server.ts"→ 错,TS 源码不能直接执行 -
"program": "${workspaceFolder}/start/server.ts"→ 错,路径不存在或非入口
正确做法:
- 确保
tsconfig.json启用"sourceMap": true和"outDir": "build" -
"program": "${workspaceFolder}/build/server.js"(对应npm run build && node build/server.js) - 或者开发期用
"program": "${workspaceFolder}/bin/server.js"(AdonisJS 官方 CLI 入口,已预编译)
用 nodemon 热重载时,必须用 attach 模式
把 runtimeExecutable 指向 nodemon 是陷阱。VSCode 会启动 nodemon 进程,但无法稳定附加到它 fork 出来的子 Node 进程,导致断点跳过、require 报错、process.env 丢失。
真正可行的流程是:
- 终端执行:
npm run dev -- --inspect-brk(AdonisJS 默认devscript 已含 nodemon +--inspect-brk) - 或手动:
nodemon --inspect-brk bin/server.js - launch.json 新增配置:
"request": "attach","port": 9229(与命令行一致)
这样 VSCode 才 attach 到 nodemon 启动的 *真实工作进程*,而不是它的父壳进程。
ORM 查询没日志?加 DB_DEBUG=true 并确认环境变量生效
Lucid ORM 的查询日志默认关闭。想在调试时看到 SQL,不能只改 config/database.ts,因为 VSCode 启动时未必读取 shell 环境变量。
必须在 launch.json 的配置里硬编码:
"env": {
"NODE_ENV": "development",
"DB_DEBUG": "true",
"NODE_OPTIONS": "--enable-source-maps"
}
否则即使 console.log 打印了模型实例,你也看不到底层执行的 SQL —— 因为 Lucid 根本没开启 debug 模式。
最常被忽略的一点:AdonisJS 的路由解析、控制器生命周期钩子(如 @before)、模型事件(如 afterCreate)全部依赖于正确的模块加载顺序和 cwd。务必在 launch.json 中加上 "cwd": "${workspaceFolder}",否则 require('./providers/AppProvider') 这类相对路径会因工作目录错位而失败。











