Tüm Amazon S3 dosyalarını Promise içindeki bir kovanın içine alın

0

Soru

Bir Sözün içinde Amazon S3'ten binlerce dosya almaya çalışıyorum, ancak liste kesilirse continuationtoken'i nasıl dahil edeceğimi ve hepsini sözün içinde nasıl bir araya getireceğimi anlayamıyorum. JS konusunda acemiyim ve biraz yardıma ihtiyacım olabilir. İşte şu ana kadar sahip olduğum şey:

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;
}

Geri dönmek için kovadaki tüm nesnelerin bir listesini oluşturana kadar çalışmaya devam etmek için işleve ihtiyacım var.

amazon-web-services aws-sdk javascript
2021-10-25 16:01:51
2
0

Sadece ikinci kez ertelemeye ihtiyacın var.

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

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

IMO, bu sadece iç içe geçmiş gibi iki kez çağrılan bir s3 işlevidir çağrı. Özyineleme, bir işlevin kendisini çağırmaya devam etmesidir belirli bir koşul yerine getirilene kadar.

Özyineleme hakkında daha fazla bilgi edinin: https://medium.com/@vickdayaram/recursion-caad288bf621

2021-10-25 16:29:42

İyi nokta - Sorumu daha ayrıntılı olarak güncelleyeceğim. Tüm dosyalar alınana kadar çalışmaya devam etmek için işleve ihtiyacım var.
AppleBaggins
0

Bir diziyi doldurmak için async/await ve aşağıdaki kodu kullanarak kovadaki tüm nesneleri listeleyebildim.

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;
}

Yardım eden herkese teşekkürler!

2021-10-26 00:59:26

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................