В рамках гораздо большей авторизации AWS SFTP lambda / api я пытаюсь вывести теги, связанные с каждым сегментом в списке.
У меня 0 опыта программирования, и я немного работал с lambdaтак что я уверен, что есть только некоторые базовые принципы NodeJS / Javascript, которые потеряны для меня.
В данный момент я сталкиваюсь с двумя основными проблемами:
- В AWS SDK "s3.getBucketTagging" используется обратный вызов, и я изо всех сил пытаюсь понять последствияэтого и работы с результатом.
- Я озадачен поведением цикла в NodeJS
Мои конкретные вопросы:
Есть ли более простой способ работы со значением «data» из s3.getBucketTagging? В конце концов, я хотел бы вывести эти данные в файл в контейнере s3. Это обратный вызов, который представляет какие-либо проблемы с этим?
Почему этот последний console.log
все еще находится в цикле? Это потому, что обратный вызов привязан к функции в цикле for? Если да, может ли кто-нибудь помочь мне понять, как это работает лучше?
Как мне заставить его ждать возврата значения до завершения цикла? Я возился с асинхронностью и обещаниями, но пока не совсем понял. Будет ли это вариант использования для них?
Почему он выходит из строя? (на самом деле это не проблема, я просто не понимаю, почему он не вернется в том порядке, в котором они находятся в массиве)
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' } ] ]