AWS Lambda报错:无法在模块外使用import语句及模块缺失问题
解决AWS Lambda中模块导入与S3读取问题
错误原因解析
- 使用ES模块的
import语句,但Lambda默认将代码识别为CommonJS模块,触发语法错误:SyntaxError: Cannot use import statement outside a module。 - 移除
import后提示找不到aws-sdk,是对Lambda运行环境的误解——Node.js运行时(14.x及以上版本)默认内置AWS SDK v2,无需手动安装。
解决方案
方案一:使用CommonJS语法(推荐,无需额外配置)
直接删除那两行import相关代码,保持纯CommonJS写法即可,代码如下:
const AWS = require('aws-sdk'); const s3 = new AWS.S3(); exports.handler = async (event) => { const bucketName = 'your-bucket-name'; const objectKey = 'your-object-key'; const params = { Bucket: bucketName, Key: objectKey }; try { const data = await s3.getObject(params).promise(); const objectContent = data.Body.toString('utf-8'); console.log(objectContent); // 处理对象内容 } catch (err) { console.log(err); // 错误处理 } };
若仍提示找不到aws-sdk,检查两点:
- Lambda运行时是否选择Node.js
- 是否误删
const AWS = require('aws-sdk');语句
方案二:改用ES模块(适合ES语法习惯)
若坚持使用ES模块,需完成以下两步:
- 在代码目录创建
package.json文件,声明模块类型:
{ "type": "module" }
- 改用AWS SDK v3的ES模块语法(需手动安装依赖后打包上传,或通过Lambda层引入):
import { S3 } from '@aws-sdk/client-s3'; const s3 = new S3(); export const handler = async (event) => { const bucketName = 'your-bucket-name'; const objectKey = 'your-object-key'; try { const data = await s3.getObject({ Bucket: bucketName, Key: objectKey }); const objectContent = await data.Body.transformToString('utf-8'); console.log(objectContent); // 处理对象内容 } catch (err) { console.log(err); // 错误处理 } };
内容的提问来源于stack exchange,提问作者Sharlet Mathews
相关产品推荐
相关产品推荐

