2017-07-11 29 views
0

以下のコードは、AWS S3から少なくとも1つのオブジェクト(おそらく2つ)を取得します。Javascriptを使用してAWS S3から複数のオブジェクトを取得し、それらが取得されたときに関数を実行する方法は?

私はAWS JS SDKを使用しています。現在、ループ内からオブジェクトを取得しています。この時点で、1つの要求で複数のオブジェクトを取得できるようになりました。

オブジェクトが取得された後、私はいくつかの画像合成を行いたい(オブジェクトは画像です)。

私の問題は、残りのコードがオブジェクトを正常に取得する前に実行されることです。コンソールにログオンしたときにはobjectsが変更されないため、私はこれを知っています。

イメージを操作するための他の機能を実行する前に、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 

を記録します。

答えて

0

これは、ファイルをダウンロードする前にconsole.log呼び出しが実行されているために発生します。あなたができることは、ファイルを受け取った後で処理することです。

app.s3.getObject(params, function(err, data) { 
    if (err) { 
     console.log(err, err.stack); 
    } 
    else { 
     objects[type] = data; 
     //Here you have the downloaded files. Do your processing here 
     console.log(objects);   
    } 
}); 

非同期動作は、さらに詳しくお読みください。

[更新]あなたは

Download multiple files using aws s3

+0

複数のファイルをダウンロードするには、次のラッパーモジュールを使用することができ、あなたの応答をありがとうございました。私は私の操作を行うことができますが、私は一緒にファイルを追加する必要がありますので、上記の方法は動作しませんので、私は両方のファイルが必要です。他のアイデア? –

+0

こんにちは、要点の答えを更新してください。そのnodejsモジュールを使用して、複数のファイルを一度にダウンロードすることができます。それはすべてのファイルをダウンロードする約束を返すでしょう。 –

関連する問題