Я пытаюсь получить список объектов из корзины S3, и когда у меня есть список объектов, я хотел бы создать предварительно подписанные URL-адреса для этих объектов. Единственный способ выяснить, как это сделать, - использовать вложенные функции обратного вызова, например:
exports.handler = async (event, context, callback) => {
console.log('processing event: %j', event);
const bucket = process.env['s3_bucket'];
if (!bucket) {
callback(new Error("s3 bucket not set"));
}
const deviceId = event['deviceId'];
const params = getListObjectsParams(deviceId, bucket);
let count = 0;
await s3.listObjectsV2(params, function (err, data) {
if (err) callback("Error getting image list: " + err);
else {
data.Contents.forEach(function (image) {
count = count + 1;
const objectParams = getObjectParams(bucket, image.Key);
s3.getSignedUrl('getObject', objectParams, function (err, url) {
if (err) {
console.log("Error");
console.log(err);
//TODO: log error getting pre signed url
} else {
images.push(url);
}
});
});
}
});
callback(null, images);
};
У меня возникли проблемы с возвратом массива изображений, так как функциязавершается до завершения вызовов listObjectsV2 и каждого из getSignedUrl. Вот мои вопросы.
- Как получить выполнение, чтобы дождаться выполнения обещаний, прежде чем завершить выполнение функции?
- Если есть лучший способ для размещения этого блока кода, обратные вызовы вложенности выглядят грязно :(