本地AWS SAM部署Lambda遇Cannot find module错误求助
问题排查与解决方法
1. 核对SAM的代码目录配置
SAM默认读取template.yml中函数的CodeUri指定目录,若该路径指向TypeScript源码目录而非编译后的输出目录(如dist/build),SAM本地会直接尝试加载未编译的.ts文件,而Lambda运行环境仅支持.js/.mjs等格式。
- 修正方案:将
CodeUri改为编译后的输出目录,例如CodeUri: dist/functions/user-api,确保编译后的gatewayEventUtil.js在该目录的对应相对路径下存在。
2. 检查TypeScript编译配置
- 确认
tsconfig.json的outDir设置正确,保证编译后的文件输出到指定目录,且目录结构与源码完全一致(比如源码里的util目录,编译后需在输出目录的对应层级保留)。 - 检查
rootDir配置,确保它覆盖所有需要编译的源码文件(包括util目录),避免部分文件未被编译到输出目录。 - 确保
moduleResolution设置为node,Node.js环境依赖该解析策略识别相对路径模块。
3. 规范SAM本地启动流程
需确保启动SAM前已完成TypeScript编译:
- 手动流程:先执行
tsc完成编译,再启动sam local start-api。 - 集成流程:使用
sam build命令完成构建后再启动本地服务,若需自定义编译逻辑,可在buildspec.yml中添加tsc编译命令,确保SAM构建时自动完成TS转JS。
4. 修正模块导入扩展名
TypeScript中导入模块可省略.js扩展名,但编译后的JS文件若保留无扩展名的导入语句,Node.js可能无法正确解析。
- 修正方案:在
tsconfig.json中设置"module": "CommonJS"或"ESNext",同时开启"esModuleInterop": true;也可尝试在TS导入语句中显式添加.js扩展名(编译后会保留该扩展名,Node.js可正确识别)。
5. 清理SAM本地缓存
SAM本地可能缓存旧的构建文件,导致新编译的模块未被加载。
- 修正方案:删除项目根目录下的
.aws-sam缓存目录,重新执行sam build和sam local start-api。
内容的提问来源于stack exchange,提问作者ciprianr
相关产品推荐
相关产品推荐

