调试TypeScript编写的Node.js AWS-SAM Lambda函数:解决模块找不到问题
TypeScript版AWS SAM项目本地调试配置方案
当然可以通过launch.json配置实现本地调试,你遇到的「模块找不到」问题是因为SAM默认直接调用JavaScript文件,而Node.js原生不识别TypeScript,且当前配置指向的是JS handler而非TS文件。下面是具体解决步骤:
1. 修正launch.json配置
调整配置,让调试器支持TS文件的执行与源码映射:
{ "version": "0.2.0", "configurations": [ { "type": "aws-sam", "request": "direct-invoke", "name": "blocksGet", "invokeTarget": { "target": "code", "projectRoot": "${workspaceFolder}/src/lambda/blocks/", // 改为你的TS文件名(不带.ts后缀).handler "lambdaHandler": "blocks.handler" }, "lambda": { "runtime": "nodejs14.x", "payload": {}, "environmentVariables": { // 注入ts-node,让Node能直接执行TS "NODE_OPTIONS": "--require ts-node/register" } }, // 开启源码映射,调试时定位到TS源码 "sourceMaps": true, "outFiles": ["${workspaceFolder}/src/lambda/blocks/**/*.js"] } ] }
2. 安装TS依赖
在你的Lambda函数目录(src/lambda/blocks/)下安装必要的开发依赖:
npm install --save-dev typescript ts-node @types/node @types/aws-lambda
3. 添加tsconfig.json配置
在同一个Lambda目录下创建tsconfig.json,确保编译规则适配Lambda环境:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "sourceMap": true, "strict": true, "esModuleInterop": true, "skipLibCheck": true }, "include": ["*.ts"], "exclude": ["node_modules"] }
4. 可选:预编译后调试
如果不想用ts-node实时编译,也可以先通过SAM构建TS到JS,再调试编译产物:
- 执行
sam build命令,SAM会自动编译TS到.aws-sam/build/目录 - 修改launch.json的
projectRoot为.aws-sam/build/blocksGet/ - 保持
lambdaHandler为blocksjs.handler(对应编译后的JS文件)
关键检查点
- 确保TS文件中的handler函数是
export const handler = ...的格式 - 确认所有依赖都已正确安装,没有缺失
- sourceMap必须开启,否则调试时只能看到编译后的JS代码
内容的提问来源于stack exchange,提问作者stuart
相关产品推荐
相关产品推荐

