【问题标题】:Get all Amazon S3 files inside a bucket within Promise在 Promise 的存储桶中获取所有 Amazon S3 文件
【发布时间】:2021-10-26 08:59:26
【问题描述】:

我试图在 Promise 中从 Amazon S3 获取数千个文件,但如果列表被截断并将其全部收集到 Promise 中,我似乎无法弄清楚如何在其中包含 ContinuationToken。我是 JS 的新手,可以使用一些帮助。到目前为止,这是我所拥有的:

getFiles()
    .then(filterFiles)
    .then(mapUrls)
;

function getFiles(token) {
    var params = {
        Bucket: bucket,
        MaxKeys: 5000,
        ContinuationToken: token
    };
    var allKeys = [];

    var p = new Promise(function(resolve, reject){
    s3.listObjectsV2(params, function(err, data) {
      if (err) { 
        return reject(err);
      }
      allKeys.push(data.Contents)
      if (data.IsTruncated) {
        s3.listObjectsV2({Bucket: bucket, MaxKeys: 5000, ContinuationToken: data.NextContinuationToken})
        console.log('Getting more images...');
        allKeys.push(data.Contents)
      }
      resolve(data.Contents);
    });
  });

  return p;
}

我需要该函数继续运行,直到我创建了存储桶中所有要返回的对象的列表。

【问题讨论】:

  • 你得到什么错误?
  • 我已经达到了可以收集 2000 个我需要的文件的程度,但我需要再做几次。我需要某种递归循环,直到 if (data.IsTruncated) 返回错误。
  • 看起来您需要在第二次和后续迭代中生成额外的 Promise-s,因为对 listObjectsV2 的调用是异步的。当data.IsTruncated 为假时,您将停止创建Promise-s。
  • 如果不是另一个Promise,则在第二个listObjectsV2 之后添加代码以收集其他结果(这是缺失的——实际上您可能会丢弃第二个迭代结果。)

标签: javascript amazon-web-services aws-sdk


【解决方案1】:

您只需要第二次 ContinuationToken

var params = {
    Bucket: bucket,
    MaxKeys: 5000,
};

if (data.IsTruncated) {
    s3.listObjectsV2({...params, ContinuationToken: data.NextContinuationToken})

IMO,这只是一个调用了两次的 s3 函数,更像是一个嵌套 称呼。递归是指函数不断调用自身 直到满足指定条件。

阅读有关递归的更多信息:https://medium.com/@vickdayaram/recursion-caad288bf621

【讨论】:

  • 好点 - 我会更详细地更新我的问题。我需要该函数继续运行,直到检索到所有文件。
【解决方案2】:

我能够使用 async/await 列出存储桶中的所有对象,并使用下面的代码填充数组。

async function getFiles(objects = []) {
    const response = await s3.listObjectsV2(params).promise();
    response.Contents.forEach(obj => filelist.push(obj.Key));
    if (response.NextContinuationToken) {
        params.ContinuationToken = response.NextContinuationToken;
        await getFiles(params, objects);
    }
    console.log(filelist.length)
    return filelist;
}

感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 2014-11-11
    • 2016-02-01
    • 1970-01-01
    • 2011-05-26
    • 2017-12-07
    • 2016-02-06
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多