使用 Node.js 18.x 时出现“errorMessage”:“require 未在 ES 模块范围中定义,您可以改用 import”
2022-12-22
34930
当我使用
aws-sdk
模块 Node.js 18.x 时:
const aws = require("aws-sdk");
exports.handler = async (event) => {
console.log('Hello!');
// some code
};
我收到此错误:
{
"errorType": "ReferenceError",
"errorMessage": "require is not defined in ES module scope, you can use import instead",
"trace": [
"ReferenceError: require is not defined in ES module scope, you can use import instead",
" at file:///var/task/index.mjs:1:13",
" at ModuleJob.run (node:internal/modules/esm/module_job:193:25)",
" at async Promise.all (index 0)",
" at async ESMLoader.import (node:internal/modules/esm/loader:530:24)",
" at async _tryAwaitImport (file:///var/runtime/index.mjs:921:16)",
" at async _tryRequire (file:///var/runtime/index.mjs:970:86)",
" at async _loadUserApp (file:///var/runtime/index.mjs:994:16)",
" at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1035:21)",
" at async start (file:///var/runtime/index.mjs:1200:23)",
" at async file:///var/runtime/index.mjs:1206:1"
]
}
相同的代码在更高版本(例如
Node.js 16.x
)上运行良好。
此错误的原因是什么?我们如何避免它?
3个回答
只需将 index.mjs 的 .mjs 扩展名更改为 index.js
Manookian
2023-05-10
Node18 for Lambda 使用 JavaScript SDK V3。
AWS SDK for Javascript v2 发布了一个支持所有 AWS 服务的 npm 包。这样,当仅使用少量服务或操作时,就可以轻松地在项目中使用多个服务,但代价是依赖性过大。
在资源受限的环境中(例如移动设备),为每个服务客户端提供单独的包可以优化依赖性。AWS SDK for Javascript v3 提供了这样的模块化包。我们还拆分了 SDK 的核心部分,以便服务客户端只提取他们需要的内容。例如,以 JSON 格式发送响应的服务将不再需要将 XML 解析器作为依赖项。
由于您只导入所需的模块,因此可以按如下方式执行操作:
const { S3 } = require("@aws-sdk/client-s3");
SDK V2
const AWS = require("aws-sdk");
const s3Client = new AWS.S3({});
await s3Client.createBucket(params).promise();
SDK V3
const { S3 } = require("@aws-sdk/client-s3");
const s3Client = new S3({});
await s3Client.createBucket(params)
向后 V2 兼容样式
import * as AWS from "@aws-sdk/client-s3";
const s3Client = new AWS.S3({});
await s3Client.createBucket(params);
文件扩展名
Lambda index.js 现在具有
.mjs
扩展名。重命名有时可以解决您遇到的任何问题。
Leeroy Hannigan
2022-12-22
确实,“Node18 for Lambda 使用 JavaScript SDK V3”,正如 @Lee Hannigan 所说
您还可以使用 v2 兼容样式,如 Amazon 文档 中所述:
import * as AWS from "@aws-sdk/client-s3";
Axel Guilmin
2023-01-23