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

Sam本地模板配置子目录handler报错:无法导入index模块

解决Lambda无法导入index模块的问题

看起来你在通过SAM的template.yaml配置Lambda函数,把api子文件夹里的index.js作为handler时遇到了模块导入错误。结合你给出的日志(显示api文件夹被挂载为/var/task),我整理了几个最可能的原因和对应的解决办法:

1. 检查Handler配置是否匹配CodeUri路径

首先确认你的template.yaml里的CodeUri和Handler配置是否对应:

  • 如果CodeUri指向的是api文件夹(比如CodeUri: ./api/),那Handler应该直接写index.handler——因为此时/var/task就是api文件夹的根目录,index.js就在这里。
  • 如果CodeUri指向的是项目根目录(CodeUri: ./),那Handler需要写成api/index.handler,告诉Lambda去api子文件夹找index.js里的handler函数。

举个正确的配置例子(当CodeUri是api文件夹时):

Resources:
  MyApiFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./api/
      Handler: index.handler
      Runtime: nodejs18.x

2. 确认index.js里的handler函数导出正确

Lambda默认使用CommonJS模块规范,所以你需要确保index.js里的handler是这样导出的:

exports.handler = async (event) => {
  // 你的handler逻辑
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

如果你用了ES模块的export default handler,Lambda默认是不识别的(除非你在api文件夹的package.json里加上"type": "module",同时确保Lambda运行时版本支持,比如nodejs14+)。

3. 检查Node.js运行时版本是否兼容

如果你的index.js里用了高版本的Node语法(比如可选链?.、空值合并运算符??等),但template.yaml里配置的Runtime是较低版本(比如已停止支持的nodejs12.x),会导致Lambda无法正确解析文件,看起来像是找不到模块,但实际是语法错误。建议把Runtime升级到当前支持的版本,比如nodejs18.x或nodejs20.x。

4. 排查文件权限问题(本地SAM测试场景)

如果你是在本地用SAM CLI测试,偶尔会遇到文件权限不足的问题。可以尝试给index.js添加可读权限:

chmod +r ./api/index.js

然后重新启动SAM本地服务。

5. 清理SAM本地缓存

有时候SAM本地的缓存会导致奇怪的问题,可以尝试清理缓存后重新部署测试:

sam local invoke --skip-pull-image --no-cache

你可以先从检查Handler配置和函数导出这两点入手,这是最常见的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:07:00