Возврат результатов и циклическое выполнение функции getBucketTagging из Javascipt AWS SDK s3 - PullRequest
0 голосов
/ 26 октября 2019

В рамках гораздо большей авторизации AWS SFTP lambda / api я пытаюсь вывести теги, связанные с каждым сегментом в списке.

У меня 0 опыта программирования, и я немного работал с lambdaтак что я уверен, что есть только некоторые базовые принципы NodeJS / Javascript, которые потеряны для меня.

В данный момент я сталкиваюсь с двумя основными проблемами:

  1. В AWS SDK "s3.getBucketTagging" используется обратный вызов, и я изо всех сил пытаюсь понять последствияэтого и работы с результатом.
  2. Я озадачен поведением цикла в NodeJS

Мои конкретные вопросы:

  1. Есть ли более простой способ работы со значением «data» из s3.getBucketTagging? В конце концов, я хотел бы вывести эти данные в файл в контейнере s3. Это обратный вызов, который представляет какие-либо проблемы с этим?

  2. Почему этот последний console.log все еще находится в цикле? Это потому, что обратный вызов привязан к функции в цикле for? Если да, может ли кто-нибудь помочь мне понять, как это работает лучше?

  3. Как мне заставить его ждать возврата значения до завершения цикла? Я возился с асинхронностью и обещаниями, но пока не совсем понял. Будет ли это вариант использования для них?

  4. Почему он выходит из строя? (на самом деле это не проблема, я просто не понимаю, почему он не вернется в том порядке, в котором они находятся в массиве)

const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const bucketNamesList = [
'test-sftp',
'test-sftp1',
'test-sftp2'
]

// fn added as attempt to work with value from callback
function getBucketTags(checkBucket, fn) {

    //Required format for AWS s3 function
    var params = {"Bucket":checkBucket}

    s3.getBucketTagging(params, function(err, data) {
        if (err) {
            //ignore any errors due to tags not existing
            if (err.code == 'NoSuchTagSet') return;                
            else {
                console.log(err)
                }
                }
        else { 
            //push bucket and tags to an array
            bucketTags.push({"Bucket": checkBucket}, data.TagSet)
            // I don't actually really understand this, but just know it helps me work with callback value
            fn(bucketTags)
            }
    });
};

function transformTags(bucketNamesList, fn) {
    //define array outside of for loop
    bucketTags = []

    //Loop over previous function with list of buckets
    //If I loop over "s3.getBucketTagging" directly it returns the tags correctly, but lists "SFTPAUTH-2" for every bucket, which is a mystery to me 

    for (checkBucket of bucketNamesList) {

        getBucketTags(checkBucket, function(bucketTags){

            //again, applying this without really understanding it
            fn(bucketTags)
        });

    };
};

//In a future step, this is when I will transform data more to fit format I want
//Maybe need some kind of wait here so it doesn't access bucketTags until forloop completes? 
transformTags(bucketNamesList, function(bucketTags) {
    console.log(bucketTags)
   });

ВЫХОД:

[[ { Bucket: 'test-sftp1' },
[ { Key: 'group', Value: 'group1' } ] ]
[ { Bucket: 'test-sftp1' },
[ { Key: 'group', Value: 'group1' } ],
{ Bucket: 'test-sftp2' },
[ { Key: 'group', Value: 'group2' } ] ]
[ { Bucket: 'test-sftp1' },
[ { Key: 'group', Value: 'group1' } ],
{ Bucket: 'test-sftp2' },
[ { Key: 'group', Value: 'group2' } ],
{ Bucket: 'test-sftp' },
[ { Key: 'group', Value: 'group1+group2' },
  { Key: 'second', Value: 'tag' } ] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...