下面的代码将从 AWS S3 检索至少一个对象(可能是两个)。
我正在使用 AWS JS SDK 并从循环内检索对象,因为此时无法通过一个请求检索多个对象。
检索到对象后,我想做一些图像合成(对象是图像)。
我的问题是我的其余代码在我成功检索对象之前执行。我知道这一点是因为登录到控制台时对象
保持不变。
在尝试执行其他功能来操作图像之前,如何确保从 S3 接收对象?
var app = require('../application');
exports.generate = function (req, res) {
objects = {
logo: req.body.logo,
}
if (!req.body.background.startsWith('#')) {
objects.background = req.body.background;
}
for (type in objects) {
var params = {
Bucket: "my-bucket",
Key: objects[type]
};
app.s3.getObject(params, function(err, data) {
if (err) {
console.log(err, err.stack);
}
else {
objects[type] = data;
}
});
}
if (objects.background) {
gm(objects.logo).append(objects.background).write('temp.jpg', function() {
console.log('Logo and background have been appended');
});
}
console.log(objects);
console.log('Finished');
}
控制台记录以下内容
{ logo: 'Original 106fm Logo #268390.jpg', background: 'test.jpg' }
Finished
检索图像时,日志应显示每个图像的数据正文。
最佳答案
关键是使用Promise对象
app.get('/api/template', (req, res) => {
let promises = [getS3Object(`templates/x.tpl`),
getS3Object(`templates/y.tpl`),
getS3Object(`templates/z.tpl`),
getS3Object('templates/b.tpl')];
return Promise.all(promises)
.then((pres) => {
const iterable = [0, 1, 2, 3];
for (let value of iterable) {
if (!pres[value].statusCode) {
res.send(pres[value]);
}
}
})
.catch((res) => {
console.log(`Error Getting Templates: ${res}`);
});
});
const getS3Object = key => {
return new Promise((resolve, reject) => {
s3.getObject({
Key: key
}, (err, data) => {
if (err){
resolve(err)
} else {
resolve(data.Body)
}
})
})
}
关于javascript - 如何使用 Javascript 从 AWS S3 检索多个对象,然后在检索到它们后执行某个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029835/