sls offline启动必须加--debug(旧版)或--inspect(v10+),否则不暴露v8调试接口;launch.json需设为attach模式、端口一致、localroot与remoteroot匹配;handler路径须严格精确,断点仅在http请求触发后生效。

sls offline 启动命令必须带 --debug 或 --inspect
不加调试参数,sls offline 就只是个普通 HTTP 服务,不会暴露 V8 inspector 接口,VSCode 根本连不到。Node.js 函数本地调试失败,90% 是因为漏了这个参数。
- Node.js 16–18:推荐用
sls offline --debug --noAuth --port 3000(--debug会自动启用--inspect) - serverless-offline@10+(2025 年后主流版本):默认禁用
--inspect,必须显式加--inspect或--inspect-brk,例如:sls offline --inspect --noAuth --port 3000 - 端口冲突时可换端口,比如
--inspect=9230,但必须同步改launch.json中的port -
--inspect-brk会让进程在第一行暂停,适合想从 handler 入口开始调试;但函数启动变慢,且需手动 resume,日常开发用--inspect更顺
launch.json 必须配成 attach,不能选 launch
sls offline 是长期运行的服务进程,不是执行完就退出的脚本,VSCode 调试器必须用 attach 模式,等函数被 HTTP 请求触发后才接入上下文。
- 配置类型必须是
"type": "node"+"request": "attach",绝不能填"program"字段(那是launch模式用的) -
port值必须和命令行中--inspect指定的端口一致,默认是9229 -
localRoot设为"${workspaceFolder}",remoteRoot填"/var/task"(Lambda 容器内路径,保持一致才能映射断点) - 别信“自动检测端口”——VSCode 不会主动扫描,端口错一个数字就连接失败,报错通常是
Could not connect to debug target
serverless.yml 中 functions.*.handler 路径必须严格匹配文件系统
本地调试失败,八成问题出在这儿,而不是 launch.json 或插件。VSCode 不会自动修正拼写,Serverless IDE 插件能高亮但不强制阻止你保存错误路径。
- 检查
functions.hello.handler值是否严格匹配实际路径,比如写成src/handlers/hello.handler,但真实文件是src/functions/hello.js,就会报Cannot find module './handler' - 路径是相对于
serverless.yml所在目录的,不是相对于package.json或项目根目录 - Node.js 的
require()对大小写、扩展名、斜杠方向都敏感,Windows 上写成反斜杠\也会失败 - 建议统一用 Unix 风格正斜杠
/,并确保文件存在且可读(比如没被.gitignore或构建脚本误删)
断点只在函数实际执行时生效,得先发请求触发
断点不是服务一启就停住——sls offline 启动后只是监听端口,必须有 HTTP 请求进来,函数才真正执行,VSCode 才会捕获到调试会话。
- 用
curl http://localhost:3000/dev/hello或 Postman 发个 GET 请求,断点才会命中 - 如果用了自定义 API Gateway 路径(如
httpEvent: path: /api/users),请求地址要对应,比如curl http://localhost:3000/api/users - async/await 场景下,图形断点可能跳过或失效,可在
await前加一行debugger;原生断点更可靠 - 函数执行太快(比如纯计算逻辑),断点可能来不及挂起就被销毁,这时
--inspect-brk更有用
sls offline 忘加 --inspect、或者 curl 发错了 URL —— 这些细节不验证,再全的 launch.json 也白搭。











