2016-10-08 5 views
2

私は狂ったように私を運転しているばかげた問題があります。私はDynamo dbを呼び出すAWSラムダ関数を持っています。AWSの関数からクエリ結果を返す方法DynamoDB - JS lambda

誰かが私を助けることができる

var aws = require('aws-sdk'); 
var ddb = new aws.DynamoDB(); 

function getName(userid) { 

ddb.scan({ 
     TableName: "Users", 
     ScanFilter: { 
      "userid": 
        { 
         "AttributeValueList": [ 
          {"S": userid} 
         ], 
         "ComparisonOperator": "EQ" 
        } 
     } 
    }, function (err, data) { 
     return data.Items[0].username; 
    }); 

}; 

exports.handler = function (event, context) { 

     var userid= '4vwe6jd56es59q'; 

     var username = getName(userid); 

     context.succeed({success: true, username: username}); 


}; 

...私は関数にddb.Scan操作は結果を得る必要があり、その後、イベントにそれを渡したいが、私は関数の内部で結果を返すことができません私はどこに失われるのか理解する?あなたがここに関数を宣言する方法

答えて

1

お知らせ:

function getName(userid) { 

そして、ここで別の関数:

function (err, data) { 

それはあなたが何かを返すようにしようとしている、第2の機能だが、何もその機能を期待されていません何かを返すため、戻り値は破棄されます。

ddb.scan()の呼び出しはただちに戻り、ddb.scan()に渡された匿名コールバック関数は、DynamoDBレスポンスが取得された後で呼び出されることに注意してください。これは基本的な非同期プログラミングの概念であり、NodeJSコードを正常に書き込むには、まず理解しなければならないことがあります。あなたのgetName関数にコールバックを渡す必要があります。コールバック関数は名前値を持つと呼び出すことができます。あるいは、ラムダ関数を設計する方法を完全に再考する必要があります。

AWS Lambdaで使用可能なNodeJSの最新バージョンを使用して、コールバックの代わりに約束を使用できるようにすることもお勧めします。これにより、非同期関数での作業が少し楽になります。

+0

ありがとうございました。アイデアは非同期ではないということでした...私は[link](http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.JsShell.05.html)として基本的なクエリーに従いました。 "docClient.scan(params、function(err、data){"。おそらく私は完全に間違ったパスですが、これは大きなコードの一部で、テーブルのメインクエリがあり、他のテーブルからJSONをビルドする前にいくつかの情報を取得することができます。 –

+0

'docClient.scan'関数も非同期です。これらのAWS APIコールの非同期性をどうにかして処理する必要があります。 NodeJS。 "それは非同期ではない"というアイデアかもしれませんが、AWS NodeJS SDKが提供するオプションではなく、NodeJSコードの作成に使用するモデルではありません。 –

0

あなたのコードで気づいた最初のことは、getName関数が実際に何も返さないため、スキャン機能が意図したとおりに動作してもnullを返すことです。

さらに重要なことに、ddb.scan(...)は非同期関数なので、結果(この場合はスキャン結果)をコールバック内に埋め込む必要があります。データは、データが返されたときにのみ渡されるように

var aws = require('aws-sdk'); 
var ddb = new aws.DynamoDB(); 

exports.handler = function (event, context) { 
     var userid= '4vwe6jd56es59q'; 
     var username = getName(userid); 

    ddb.scan({ 
     TableName: "Users", 
     ScanFilter: { 
      "userid": 
        { 
         "AttributeValueList": [ 
          {"S": userid} 
         ], 
         "ComparisonOperator": "EQ" 
        } 
     } 
    }, function (err, data) { 
     var username = data.Items[0].username 
     context.succeed({success: true, username: username}); 
    }); 
}; 

注context.succeedは、現在、非同期コールバックの内部に埋め込まれている:あなたのコードはより次のようになります意味

+0

マイケルに感謝します。それは他のコードの一部なので、もう一方の方法です。私はforeachを持っています。このクエリの結果をJSONに追加するには、for eachにクエリを実行します。私はあなたが示唆しているように、それぞれのデータのための最初のクエリを持っています。結果の中に2番目のクエリを入れ子にする必要があります。 –

関連する問題