簡體   English   中英

在 Promise 中獲取存儲桶中的所有 Amazon S3 文件

[英]Get all Amazon S3 files inside a bucket within Promise

我正在嘗試從 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;
}

我需要該函數繼續運行,直到我創建了要返回的存儲桶中所有對象的列表。

您只需要第二次使用ContinuationToken

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

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

IMO,這只是一個被調用兩次的 s3 函數,更像是一個嵌套調用。 遞歸是指函數不斷調用自身直到滿足指定條件。

閱讀有關遞歸的更多信息: https : //medium.com/@vickdayaram/recursion-caad288bf621

我能夠使用 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;
}

感謝所有幫助過的人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM