从GET函数返回字符串 - AWS DynamoDB - Node.js

时间:2018-04-08 10:52:37

标签: node.js amazon-web-services aws-lambda amazon-dynamodb

这似乎是一个非常简单的操作,我确信在解决之后我会踢自己!

此函数从运行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
};

2 个答案:

答案 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;
}