【问题标题】:Return String from GET function - AWS DynamoDB - Node.js从 GET 函数返回字符串 - AWS DynamoDB - Node.js
【发布时间】:2021-04-16 00:42:37
【问题描述】:

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

此函数从运行 Node.js 6.10 的 AWS Lambda 的 Dynamodb 数据库中检索日期。它在其他地方称为

var lastLogin = getLastLogin(UserId);

查看控制台,它成功检索日期,我得到“obj is 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
};

【问题讨论】:

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


    【解决方案1】:

    首先,您的代码中有几个问题:您从其范围之外引用obj,这自然会导致undefined 加上您将get 的回调(箭头函数)包含在额外的括号。

    但是,这不是您的主要问题。 get 方法是使用回调接口的异步调用。因此,您的函数在 get 返回任何结果之前退出。

    您可以尝试使用回调或“thenable”承诺。例如:

    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);
      });
    

    【讨论】:

    • 太棒了,谢谢!初学者编码所以不知道怎么做,但这是完全有道理的!
    【解决方案2】:

    您正在调用始终异步的数据库。 DynamoDB 将回调函数传递到 .get 方法的末尾,当结果返回时它调用该方法,因此该值被传递到您记录它的闭包中。但是,代码继续在该函数之外运行,而无需等待它。该解决方案使用与上述实现类似的 Promise,但编写方式略有不同,一旦成功解决,我们将值返回给名为“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;
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 2010-12-14
      • 2014-12-07
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多