You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"配置,推荐)

不需要修改文件后缀,仅调整两处配置即可:

  1. 确保lambda.js使用ES模块规范导出handler,示例如下:
// lambda.js 正确导出写法
export const handler = async (event, context) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: "请求成功"
    })
  }
};
  1. 修改serverless.yml中的函数配置,开启ES模块加载支持:
functions:
  你的函数名:
    handler: lambda.handler
    runtime: nodejs14.x
    # 新增环境变量启用ES模块加载支持
    environment:
      NODE_OPTIONS: --experimental-specifier-resolution=node

方案2:全链路使用CommonJS

如果不需要使用ES模块特性,按以下步骤调整:

  1. 删除package.json中的"type": "module"配置项
  2. 调整lambda.js的导出方式为CommonJS规范:
// lambda.js 导出写法
exports.handler = async (event, context) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: "请求成功"
    })
  }
};
  1. serverless.yml中的handler配置保持默认的lambda.handler即可。

补充:坚持使用.cjs后缀入口文件的适配方法

如果你确定要使用lambda.cjs作为入口文件,按以下步骤调整:

  1. 修改serverless.yml中的handler配置,同时添加打包包含规则:
functions:
  你的函数名:
    handler: lambda.handler
    runtime: nodejs14.x
package:
  include:
    - 'lambda.cjs'
  1. 确保lambda.cjs使用CommonJS规范导出handler。

内容的提问来源于stack exchange,提问作者Saptarshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:39:03