来自DynamoDB的映射值在Node.js中未定义

时间:2017-08-03 11:31:09

标签: javascript node.js dictionary amazon-dynamodb aws-lambda

我有一个在Node.js 4.3中运行的Lambda函数。该函数的输入参数是一个String,它是从AWS Lex bot发送的。

我想从DynamoDB表中获取一个项目。在这个项目中,我有一个Map-type属性,它包含一个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 个答案:

答案 0 :(得分:1)

dynamodb.getItem()正在执行异步,由于这个原因,它有一个回调函数。

console.log(names)在调用dynamodb之前返回任何值之前执行。

在getItem函数中添加一个console.log(),你会发现这是真的。

Google"异步javascript"你会找到一些好的指针。