此函数从运行Node.js 6.10的AWS Lambda中的Dynamodb数据库中检索日期。它在其他地方称为
var lastLogin = getLastLogin(UserId);
查看控制台它成功检索日期,我得到“obj是2018-04-08”,但我似乎无法将“obj”字符串传递给lastLogin变量。
function getLastLogin(UserId) {
var docClient = new AWS.DynamoDB.DocumentClient();
var table = "REMOVED-FOR-PRIVACY";
var params = {
TableName:table,
Key:{
"UserId": UserId,
}
};
console.log("Getting last login...");
docClient.get(params, ((err, data) => {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
} else {
var payload = JSON.stringify(data, null, 2);
console.log ('payload content = ' + payload);
if (payload == '{}') {
console.log ('found nothing');
} else {
obj = JSON.parse (payload).Item.lastLogin;
obj = JSON.stringify(obj);
console.log ("obj is " + obj); // obj is 2018-04-08
}}
return obj; }));
console.log("Returned date is " + obj); // Returned date is undefined
};
答案 0 :(得分:2)
首先,您的代码中存在一些问题:您从其范围之外引用obj
,这自然会导致undefined
加上您封闭回调(箭头函数)额外括号中的get
。
但是,这不是你的主要问题。 get
方法是使用回调接口的异步调用。因此,您的函数会在get
返回任何结果之前退出。
您可以尝试使用回调或'可能'的承诺。例如:
function getLastLogin(userId) {
const docClient = new AWS.DynamoDB.DocumentClient();
const params = {
TableName: "TABLE_NAME",
Key: {
"UserId": userId
}
};
return docClient.get(params).promise();
}
let lastLogin;
getLastLogin(userId)
.then((data) => {
if (!data.Item || !data.Item.lastLogin) {
console.log("User not found.");
} else {
lastLogin = data.Item.lastLogin;
console.log("Last login: " + lastLogin);
}
})
.catch((err) => {
console.log(err);
});
答案 1 :(得分:0)
您正在调用始终异步的数据库。 DynamoDB 将回调函数传递到 .get 方法的末尾,当结果返回时它会调用该方法,因此该值被传递到您正在记录它的闭包中。但是,代码继续在该函数之外运行,而无需等待。此解决方案使用与上述实现类似的承诺,但编写方式略有不同,一旦成功解析,我们将值返回到名为“result”的新变量。使用 ES6 语法重写。
const getLastLogin = UserId => {
const docClient = new AWS.DynamoDB.DocumentClient();
const table = "REMOVED-FOR-PRIVACY";
const params = {
TableName:table,
Key: {
"UserId": UserId,
}
}
const result = new Promise((resolve, reject) => docClient.get(params, ((err, data) => {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
reject(err);
}
if (data) {
resolve(data);
}
})));
return result;
}