2017-08-03 5 views
0

私はNode.js 4.3で動作するラムダ関数を持っています。関数の入力パラメータは文字列で、AWS Lexボットから送信されます。DynamoDBからのマップの値はNode.jsで定義されていません

DynamoDBテーブルからアイテムを取得したいとします。このアイテムでは、Map型の属性があります。これには、StringキーとString値が含まれています。私は、関数の始めにパラメータとして得たキーストリングを使用して、そのマップから値を取得したいと思います。

問題は、私がコンソールにログを記録すると、私にはすべて{}があることがわかります。

これは私のコードです:

var AWS = require('aws-sdk'); 
AWS.config.region = 'us-east-1'; 
var dynamodb = new AWS.DynamoDB(); 

const sessionAttributes = intentRequest.sessionAttributes; 
const slots = intentRequest.currentIntent.slots; 
const name = slots.names; 

var id = null; 
if (name == "a") { 
    id = "00"; 
} else if (name == "b") { 
    id = "01"; 
} 

var params = { 
    TableName: 'names', 
    Key: { 
     'id' : {S: 'test-id'} 
    } 
}; 

var names = {}; 

dynamodb.getItem(params, function(err, data) { 
    if (err) { 
     console.log(err); // an error occurred 
    } else { 
     names = data.Item.names.M; 
    } 
}); 

console.log(names); 

var content = names[id]; 

callback(close(sessionAttributes, 'Fulfilled', 
{'contentType': 'PlainText', 'content': content})); 

あなたが見ることができるように、コードの末尾にconsole.log行があります。この行は、単に{}と記録されます。最終的なメッセージの内容はundefinedです。

これを解決するにはどうすればよいですか?

答えて

1

dynamodb.getItem()が非同期にを実行していますが、これは非常に理由があるためです。

dynamodbの呼び出しで任意の値が返される前にconsole.log(names)が実行されています。

getItem関数内にconsole.log()を追加すると、これが当てはまります。

Google "非同期javascript"とあなたは良い指針を見つけるでしょう。

関連する問題