繁体   English   中英

如何通过 JavaScript 访问 S3 存储桶?

[英]How to access S3 bucket through JavaScript?

我查看了其他一些帖子并尝试复制他们所做的事情,但似乎没有一个遇到与我相同的问题。 基本上,我正在尝试存储 S3 存储桶中的密钥列表,以便可以在我的 Vue 应用程序中遍历它们。 我有下面的代码,你可以看到我有 3 个console.log语句,我正在尝试打印files的值。 第一个打印完全符合我的预期,而第二个打印[] ,第三个根本不打印。 因此,由于某种原因,它不会保留s3.listObjectsV2() function 之外的files值,这意味着我无法在应用程序中访问实际文件本身。

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();

这是因为您没有等到s3.listObjectsV2完成获取其数据。 虽然s3.listObjectsV2看起来不像 function 您应该等到它完成,它需要时间向s3发送请求并获取您请求的数据。

在您提供的代码中,第二个console.log很可能会在第一个console.log之前执行,到那时您不会有任何数据推送到files 因此它将打印[] 在第三个日志之前,它会检查files中是否有任何元素再次等于false ,因为files = []

因此,您需要将其包裹在 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();

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

请试试

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会收到一个包含数据的回调,您将在 function 调用中处理这些数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM