节点 S3Client 错误 - input.useDualstackEndpoint 不是函数

Posted

技术标签:

【中文标题】节点 S3Client 错误 - input.useDualstackEndpoint 不是函数【英文标题】:Node S3Client Error - input.useDualstackEndpoint is not a function 【发布时间】:2022-01-07 10:04:35 【问题描述】:

我正在尝试以打字稿编写的 lambda 格式获取 S3 文件夹中的文件列表。我已将以下依赖项添加到我的 package.json。

"@aws-sdk/client-s3": "^3.41.0",
"@aws-sdk/node-http-handler": "^3.40.0",

然后我像这样使用 S3 客户端:

const client = new S3Client(
    maxAttempts: 3,
    retryMode: 'STANDARD',
    region: getAwsRegion(),
    requestHandler: new NodeHttpHandler(
      connectionTimeout: 3000, // Timeout requests after 3 seconds
      socketTimeout: 5000, // Close socket after 5 seconds
    ),
    credentials: args.credentials,
  );


  const listObjectsCommand = new ListObjectsCommand(
    Bucket: args.bucketName,
    Delimiter: '/',
    Prefix: pathToPartition,
  );
  const objects = await client.send(listObjectsCommand);

我也尝试过使用 ListObjectsV2Command,但它有同样的错误。错误是:

TypeError: input.useDualstackEndpoint 不是函数\n at Object.getEndpointFromRegion (/var/task/node_modules//node_modules/@aws-sdk/config-resolver/dist-cjs/endpointsConfig/utils/getEndpointFromRegion.js:12:46)\n 在 processTicksAndRejections (internal/process/task_queues.js:95:5)\n 在异步 Object.serializeAws_restXmlListObjectsCommand (/var/task/node_modules//node_modules/@aws-sdk/client-s3/dist/cjs/protocols/Aws_restXml.js:2386:68)\n 在异步 /var/task/node_modules//node_modules/@aws-sdk/middleware-serde/dist-cjs/serializerMiddleware.js:5:21 .

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

这是由于我拥有的 package.json 和依赖项的 package.json 中使用的 aws-sdk 版本不匹配而发生的。将其更新为相同版本可以解决此问题!

【讨论】:

【参考方案2】:

这是您的函数的工作最小版本。先让这个简单的版本运行起来,然后逐渐增加复杂性。

AWS_REGION 是 lambda 提供的环境变量。我定义了BUCKET env var。您可以将存储桶名称与事件负载一起传递(或者,首先对其进行硬编码以最大程度地减少错误来源)。

import  S3Client, ListObjectsCommand from '@aws-sdk/client-s3';

const client = new S3Client( region: process.env.AWS_REGION );
const bucket = process.env.BUCKET;

export async function handler(): Promise<void> 
  const cmd = new ListObjectsCommand(
    Bucket: bucket
  );

  const objects = await client.send(cmd);

  console.log(objects)

【讨论】:

是的,getAwsRegion() 函数也使用环境变量 AWS_REGION 获取它,只是带有一些日志记录。我之前尝试过仅使用存储桶路径的简单命令,但失败并出现完全相同的错误 这令人失望。我无法复制您的错误。你需要做一些调试:用另一个桶试试。尝试另一个 SDK 命令(如 list buckets 以查看客户端是否正常工作。尝试使用计算机上的 AWS CLI 运行 aws s3 listObjects。您会得到图片。

以上是关于节点 S3Client 错误 - input.useDualstackEndpoint 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

当在PHP上使用带有IP的getIterator时,AWS S3Client解析错误的URL

S3Client 无法在 QuarkusTest 中加载凭据,在 quarkus 2+ 中使用 QuarkusTestResourceLifecycleManager

在 s3 中使用加速模式时无法解决主机错误

如何在 put_object 中指定标记?

Ceph分布式存储之三-S3接口编程

分配节点ID失败,错误:'错误:无法分配节点ID