2017-12-30 38 views
0

コンテキスト: AWSラムダ関数を使用してAlexaスキルを作成しています。ラムダ関数コードそのもの。私は、S3ファイルの内容にアクセスし、それを関数の変数に代入しようとしていたので、残りのコードで使用できるようになりましたが、正しく動作していないようです。関連するコードについては以下を、コンソールに印刷するときは私が見ることができるものを参照してください。AWS Lambda関数のS3からJSONファイルを使用する(Alexa用)

ラムダ関数:

var handlers = { 

    'LaunchRequest': function() { 

    var AWS = require('aws-sdk'); 
    var s3 = new AWS.S3(); 
    data = s3.getObject(myParams, function(err, data) { 
     if(err) { console.log(err, err.stack);} 
     else { 
      console.log('First step'); 
      var fileText = data.Body.toString(); 
      console.log('Second Step' + fileText); 
      return fileText; 
     } 
    }); 

    console.log('Third Step' + data); 
    } 
} 

コンソール出力:

Function Logs: 
START Version: $LATEST 
2017-12-29T23:59:38.585Z  Warning: Application ID is not set 
2017-12-29T23:59:40.024Z  Third Step[object Object] 
2017-12-29T23:59:40.159Z  First step 
2017-12-29T23:59:40.183Z  Second Step[{category1: "test1", category2: "test2", category3: "test3"}] 

なぜこのコードでは、まず、 "第三のステップ" を印刷していますか?

答えて

0

ノード内のすべてが非同期であることを忘れないでください。 getObjectは、コールバックがトリガーされる前に戻ります。その戻り値は無関係です。応答はコールバックによってのみアクセスできます。

この手順をコールバックに移動すると、予想通りの行が得られます。

直感的ではない場合は、ラムダのPythonのようなより単純な言語を使用することをお勧めします。 jsに関わっている場合は、asyncライブラリ、特にwaterfallの方法論が役立ちます。

+0

まだ印刷されているはずです。 –

+0

何が印刷されるべきですか?コールバックの戻り値はどこにもなく、getObjectは[Object object]であるAWS.Requestを返します。しかし、実際には何もコンテンツで何もしていません。すべてのコンソールログの呼び出しが表示されます。 –

関連する問題