javascript - 如何使用 Javascript 从 AWS S3 检索多个对象,然后在检索到它们后执行某个函数?

标签 javascript amazon-web-services amazon-s3

下面的代码将从 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/

相关文章:

amazon-web-services - AWS C9 - 您的环境配额用完。请腾出一些空闲空间

amazon-web-services - AWS如何让ASG始终使用最新的AMI?

python - AWS Lambda Python S3读取文件错误

javascript - 根据 if/else 语句修改设置 "option"值

javascript - 如何使用 JavaScript 在浏览器中存储文件

node.js - AWS Elastic Beanstalk : Do I have to deploy my app with full "/node_modules" and "/bower_components" and compiled sass and other dependencies?

javascript - Amazon S3 + CloudFront CORS 问题

apache-spark - 如何使用 flatMap() 在 PySpark 中并行列出 S3 对象?

javascript - 第一次事件未在选项卡上发生

javascript - 使用 _.orderBy 更改源数组