开发者问题收集

使用 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 扩展名。重命名有时可以解决您遇到的任何问题。


source

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