AWS Serverless部署Node14 REST API报Cannot find module 'lambda'错误
问题根因
- 首个加载ES模块报错:Node 14+ 版本中,当
package.json配置了"type": "module"时,所有.js后缀文件会默认按ES模块规范解析,但AWS Lambda Node.js 14.x 运行时默认使用CommonJS规范的require()加载入口文件,ES模块无法被require直接加载,因此触发报错。 - 重命名为
lambda.cjs后找不到模块报错:你仅修改了入口文件后缀,未同步调整serverless.yml中的handler匹配规则,同时旧版本Serverless框架默认打包规则可能会过滤.cjs后缀文件,导致部署包中没有对应入口文件,触发模块找不到错误。
可行解决方案
方案1:全链路使用ES模块(适配现有"type": "module"配置,推荐)
不需要修改文件后缀,仅调整两处配置即可:
- 确保
lambda.js使用ES模块规范导出handler,示例如下:
// lambda.js 正确导出写法 export const handler = async (event, context) => { return { statusCode: 200, body: JSON.stringify({ message: "请求成功" }) } };
- 修改
serverless.yml中的函数配置,开启ES模块加载支持:
functions: 你的函数名: handler: lambda.handler runtime: nodejs14.x # 新增环境变量启用ES模块加载支持 environment: NODE_OPTIONS: --experimental-specifier-resolution=node
方案2:全链路使用CommonJS
如果不需要使用ES模块特性,按以下步骤调整:
- 删除
package.json中的"type": "module"配置项 - 调整
lambda.js的导出方式为CommonJS规范:
// lambda.js 导出写法 exports.handler = async (event, context) => { return { statusCode: 200, body: JSON.stringify({ message: "请求成功" }) } };
serverless.yml中的handler配置保持默认的lambda.handler即可。
补充:坚持使用.cjs后缀入口文件的适配方法
如果你确定要使用lambda.cjs作为入口文件,按以下步骤调整:
- 修改
serverless.yml中的handler配置,同时添加打包包含规则:
functions: 你的函数名: handler: lambda.handler runtime: nodejs14.x package: include: - 'lambda.cjs'
- 确保
lambda.cjs使用CommonJS规范导出handler。
内容的提问来源于stack exchange,提问作者Saptarshi
相关产品推荐
相关产品推荐

