VSCode调试Sails.js失败主因是launch.json未正确配置运行时入口或环境变量未继承:必须用npm run debug而非直接执行app.js,以确保Sails CLI完整初始化MVC上下文。

VSCode 调试 Sails.js 项目失败,90% 是因为 launch.json 没配对运行时入口,或环境变量没继承到内置终端——不是框架难,是调试链路断在了 Node 启动环节。
为什么 sails lift 能跑,但 VSCode 断点不生效
根本原因:VSCode 默认用 node 直接执行文件,而 Sails.js 的启动逻辑封装在 sails CLI 里,不是裸 node app.js。直接写 "program": "app.js" 会跳过所有 Sails 生命周期钩子(如 hooks、policies、bootstrap),导致模型加载失败、路由注册为空,甚至报 Cannot find module 'sails'。
- 正确做法是让 VSCode 启动
npm run debug或sails lift --debug,而不是绕过 CLI - 确保项目根目录下
package.json有"debug": "sails lift --debug"脚本 -
launch.json中必须设"runtimeExecutable": "npm"+"runtimeArgs": ["run-script", "debug"],不能写"program" - macOS/Linux 下若终端能跑
sails -v但 VSCode 内置终端报 command not found,请检查~/.zshrc是否导出sails所在路径(通常是~/.npm-global/bin)
launch.json 必须包含的字段组合
Sails.js 不是普通 Express 应用,它依赖 CLI 初始化整个 MVC 上下文。调试配置必须复现 CLI 启动行为,否则连 sails.models 都是空的。
-
"type": "node"—— 不要用pwa-node,Sails.js 1.x 对新版调试协议支持不稳定 -
"request": "launch"—— 不要用attach,除非你手动在终端启sails lift --inspect -
"runtimeExecutable": "npm"和"runtimeArgs": ["run-script", "debug"]是关键,"port": 9229可省略(Sails 自动分配) - 加
"env": { "NODE_ENV": "development" },避免生产模式下日志被吞、hook 被跳过 - 不要设
"cwd"到子目录,必须保持工作目录为项目根(即含app.js和package.json的目录)
ESLint 和自动修复怎么适配 Sails.js 结构
Sails.js 的控制器、模型、策略等文件散落在 api/ 下多层目录,ESLint 默认不递归检查,且部分全局变量(如 sails, req, res)会被标为未定义。
- 在项目根建
.eslintrc.js,globals字段补全 Sails 全局:"sails": "readonly", "req": "readonly", "res": "readonly", "next": "readonly" -
overrides针对api/**/*开启node/no-unsupported-features/es-builtins规则,避免误报Promise.allSettled等 - 禁用
no-unused-vars在config/bootstrap.js,因为里面常有预留但暂未调用的函数 - VSCode 设置中开
"eslint.autoFixOnSave": true,但别对api/policies/目录启用自动修复——策略函数签名敏感,格式化可能破坏return res.forbidden()这类链式调用
热重载改完控制器却没反应?检查 nodemon 监听范围
Sails.js 官方不内置热重载,靠 nodemon 实现。默认只监听 app.js 和 config/,漏掉 api/controllers/ 就等于白配。
- 建
nodemon.json放项目根,内容必须包含:"watch": ["api/**/*", "config/**/*", "tasks/**/*", ".env"] -
package.json的"dev"脚本写成:"nodemon --config nodemon.json --exec sails lift" - 避免用
npm run dev同时启前端+后端——Sails.js 的lift进程一旦 stdout 被重定向就可能卡住,建议前后端分 terminal 标签页运行 - 改完 policy 后重启仍不生效?先
rm -rf .tmp/,Sails 会缓存 hook 注册结果
最易被忽略的是:Sails.js 的 bootstrap.js 里如果用了 await,必须确保 package.json 里 "type": "module" 不存在——Sails.js 1.x 仍基于 CommonJS,强行开 ESM 会导致 require() 失败且错误堆栈极难定位。











