如何解决CDK部署AWS Lambda时的‘Cannot use import statement outside a module’错误
解决AWS Lambda Node.js v20中ES6模块语法错误(SyntaxError: Cannot use import statement outside a module)
核心原因
Lambda运行时未识别你的代码为ES模块,可能是部署包中缺少模块类型配置,或CDK打包时未正确输出ES模块格式。
解决方案
1. 使用NodejsFunction构造并配置ES模块打包
AWS CDK的NodejsFunction(基于esbuild)是处理Node.js Lambda最便捷的方式,需明确配置打包输出为ES模块,并指定目标runtime版本:
修改lib/my-stack.js中的Lambda定义:
import { Stack, StackProps } from 'aws-cdk-lib'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Runtime } from 'aws-cdk-lib/aws-lambda'; import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Construct } from 'constructs'; export class MyStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const myLambda = new NodejsFunction(this, 'MyLambda', { runtime: Runtime.NODEJS_20_X, entry: './src/index.js', bundling: { // 指定输出为ES模块格式 format: OutputFormat.ESMODULE, // 针对Node.js 20打包 target: 'node20', // 排除AWS SDK(Lambda运行时自带) externalModules: ['@aws-sdk/*'], }, }); } }
2. 确保ES模块导入路径完整
Node.js ES模块要求导入时必须带完整文件后缀,检查src/index.js中的导入语句:
// 正确写法(带.js后缀) import { foo } from './foo-service.js';
同时确保foo-service.js也位于src目录下,且采用ES模块语法(用export导出)。
3. 验证部署包中的模块配置
如果坚持在src目录添加package.json,确保其内容为:
{ "type": "module" }
NodejsFunction默认会打包entry所在目录的所有文件,所以这个package.json会被包含进部署包,让Lambda识别该目录下的文件为ES模块。
4. 避免混用CommonJS与ES模块
确保项目中所有文件都采用ES模块语法(用import/export),不要出现require()语句,避免模块类型冲突。
验证步骤
- 运行
cdk synth查看生成的CloudFormation模板,确认Lambda的Runtime为nodejs20.x。 - 部署后,在Lambda控制台查看部署包内容,确认
src目录的文件(包括package.json如果有的话)已正确打包。 - 手动触发Lambda测试,检查CloudWatch日志是否仍有语法错误。
内容的提问来源于stack exchange,提问作者adam.shaleen
相关产品推荐
相关产品推荐

