当前位置: 首页 > 知识库问答 >
问题:

如何通过JavaScript访问S3 bucket?

干旺
2023-03-14

我看了一些其他帖子,试图复制他们所做的,但他们似乎都没有遇到与我相同的问题。基本上,我试图存储S3存储桶中的密钥列表,以便在我的Vue应用程序中迭代它们。我有下面的代码,你可以看到我有3个控制台。记录我试图打印文件值的语句。第一个完全按照我的预期打印,而第二个打印,而第三个根本不打印。因此,出于某种原因,它没有将文件的值持久化到s3之外。listObjectsV2()函数,这意味着我无法访问应用程序中的实际文件本身。

let AWS = require("aws-sdk");
AWS.config.update({
  accessKeyId: process.env.VUE_APP_ACCESS_KEY,
  secretAccessKey: process.env.VUE_APP_ACCESS_KEY,
  region: "us-east-1",
});
let s3 = new AWS.S3();

let params = {
  Bucket: "my-bucket",
  Delimiter: "",
};

let getS3Files = () => {
  let files = [];
  s3.listObjectsV2(params, function (err, data) {
    if (data) {
      data.Contents.forEach((file) => {
        files.push({
          fileName: file.Key,
          fileDate: file.LastModified,
        });
      });
      console.log(files);
    }
  });
  console.log(files);
  if (files.length > 0) {
    files = files.sort((a, b) => b.fileDate - a.fileDate);
    console.log(files);
  }
  return files;
};

getS3Files();

共有2个答案

慕铭
2023-03-14

我不熟悉s3 api,但我知道listObjectsV2是一个异步操作,因此文件将为空,因为它发生在异步调用之外,并且在具有值之前执行

请试一试

let AWS = require("aws-sdk");

AWS.config.update({
  accessKeyId: process.env.VUE_APP_ACCESS_KEY,
  secretAccessKey: process.env.VUE_APP_ACCESS_KEY,
  region: "us-east-1",
});

let s3 = new AWS.S3();
let params = {
  Bucket: "my-bucket",
  Delimiter: "",
};

let getS3Files = (callback) => {
  s3.listObjectsV2(params, function (err, data) {
    callback(data);
  });
};

getS3Files((data) => {
  const files = data.Contents.map((file) => ({
    fileName: file.key,
    fileDate: file.LastModified,
  })).sort((a, b) => b.fileDate - a.fileDate);

  return files;
});

在这种情况下,getS3Files接收一个包含数据的回调,您将在函数调用中处理这些数据。

看看这个问题如何从异步调用返回响应?

宋昕
2023-03-14

这是因为您没有等到s3。listObjectsV2完成对其数据的提取。虽然<代码>s3。listObjectsV2似乎不是一个您应该等到它完成的函数,它需要时间向s3发送请求并获取您请求的数据。

在您提供的代码中,第二个控制台。日志很可能在第一个控制台之前执行。记录,到那时,您将不会有任何数据推送到文件中。因此,它将打印【】。在第三个日志之前,它会检查您的文件中是否有任何元素,因为文件=[],因此该元素再次等于false。

所以,你需要把它包装在一个promise周围,等待它完成。

let getS3Files = async () => {
  let files = [];

  await new Promise(function (resolve, reject) {
    s3.listObjectsV2(params, function (err, data) {
      if (data) {
        data.Contents.forEach((file) => {
          files.push({
            fileName: file.Key,
            fileDate: file.LastModified,
          });
        });
        console.log(files);
        resolve();
      } else {
        reject(err);
      }
    });
  });
  console.log(files);
  if (files.length > 0) {
    files = files.sort((a, b) => b.fileDate - a.fileDate);
    console.log(files);
  }
  return files;
};

await getS3Files();

 类似资料:
  • 问题内容: 我想捕获客户端JavaScript中的HTTP请求标头字段,主要是Referer和User-Agent。我该如何访问它们? Google Analytics(分析)设法通过将您嵌入到页面中的JavaScript来获取数据,因此绝对有可能。 问题答案: 如果要访问引荐来源网址和用户代理,客户端Javascript可以使用这些引荐来源网址和用户代理,但不能直接访问标头。 要检索引荐来源网址

  • 问题内容: 我开始按照Android所没有使用的教程进行操作,并得到以下信息: 我想这可以归结为几个问题: 我没有创建自己的信任库,但是在网上搜索教程和其他内容时,不确定如何创建信任库。有没有一种方法可以创建或修改信任库以在其中存储所需的证书?(如果有任何不同,我使用的是自签名证书) 如何使SSL握手顺利进行?现在,我得到的错误是: 老实说,我真的不明白这意味着什么。 我需要在Android设备上

  • 问题内容: 我试图弄清楚如何使用JavaFx。我在Scene Builder中构建了应用程序界面。但是我无法访问该组件,因为所有组件都已加载到Parent中。 如果我在“ Pane”上更改“ Parent”,则可以访问getChildren(),但是如果我知道fx:id …,还不清楚如何获得控制权。 问题更简单。我在Scene Builder中添加了Label或TextField。如果我知道fx:

  • 问题内容: 是否可以通过注释处理器访问带有注释的元素? 是否可以通过注释处理器访问带注释的类型边界? 高度赞赏我错过的相关文档的链接。 内容: 注释: 一个示例类: 处理器: 在classpath 上使用编译以上内容将显示消息,但永远不会调用该方法。当方法参数中存在注释时,使用注释向处理器添加另一个注释可以正常工作。如果方法参数带有注释,则过程将再次忽略该元素。 问题答案: 该注释是有点棘手,因为

  • 我正在尝试使用三个虚拟机(Master–10.x.x.4、Node1–10.x.x.150、Node2–10.x.x.160)创建Kubernetes集群。 我能够通过此链接成功创建留言簿应用程序:http://kubernetes.io/v1.0/examples/guestbook/.我只对frontend-service.yaml做了一个更改:使用NodePort。我可以使用节点IP和端口号