2016-10-08 38 views
2

我有一个愚蠢的问题,让我发疯。我有一个AWS lambda函数,可以调用Dynamo db。如何从AWS DynamoDB中的函数返回查询结果-JS lambda

我想有ddb.Scan操作成一个函数得到的结果,然后将它传递给事件,但我不能返回结果的函数内部...

var aws = require('aws-sdk'); 
var ddb = new aws.DynamoDB(); 

function getName(userid) { 

ddb.scan({ 
     TableName: "Users", 
     ScanFilter: { 
      "userid": 
        { 
         "AttributeValueList": [ 
          {"S": userid} 
         ], 
         "ComparisonOperator": "EQ" 
        } 
     } 
    }, function (err, data) { 
     return data.Items[0].username; 
    }); 

}; 

exports.handler = function (event, context) { 

     var userid= '4vwe6jd56es59q'; 

     var username = getName(userid); 

     context.succeed({success: true, username: username}); 


}; 

有人可以帮助我了解我迷路的地方?

回答

1

注意如何声明此功能:

function getName(userid) { 

这里的另一个功能:

function (err, data) { 

这是第二个功能,即你正在试图返回的东西,但没有什么期待该功能返回任何东西,所以返回值被丢弃。

请注意,对ddb.scan()的调用立即返回,并且在检索到DynamoDB响应后稍后调用传递给ddb.scan()的匿名回调函数。这是一个基本的异步编程概念,在成功编写NodeJS代码之前,您必须先了解它。您需要将回调函数传递给您的函数,该函数只要具有名称值即可调用该函数,或者您可能需要重新考虑完全设计Lambda函数的方式。

我还建议使用AWS Lambda上提供的最新版本的NodeJS,以便您可以使用promise而不是回调函数,这使得使用异步函数更容易一些。

+0

非常感谢。这个想法是让它不是异步...我跟随基本查询[链接](http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.JsShell.05.html)查询基于“docClient.scan(params,function(err,data){”。可能我完全在错误的路径上,但这是一个更大的代码的一部分,我在表上有一个主要查询并且我想合并在构建JSON之前从另一个表中获取一些信息... –

+0

'docClient.scan'函数也是异步的。如果您想要编写代码,您将必须以某种方式处理这些AWS API调用的异步性质NodeJS,这个想法可能是“让它不是异步”,但这不是AWS NodeJS SDK给你的选项,也不是真的用来编写NodeJS代码的模型。 –

0

我注意到你的代码的第一件事是你的getName函数实际上并不返回任何东西,所以即使扫描函数按预期工作,它也会返回null。

更重要的是,ddb.scan(...)是一个异步函数,因此,您必须在回调中嵌入想要完成的所有内容(在本例中为扫描结果)。

这意味着你的代码应该看起来更像是这样的:

var aws = require('aws-sdk'); 
var ddb = new aws.DynamoDB(); 

exports.handler = function (event, context) { 
     var userid= '4vwe6jd56es59q'; 
     var username = getName(userid); 

    ddb.scan({ 
     TableName: "Users", 
     ScanFilter: { 
      "userid": 
        { 
         "AttributeValueList": [ 
          {"S": userid} 
         ], 
         "ComparisonOperator": "EQ" 
        } 
     } 
    }, function (err, data) { 
     var username = data.Items[0].username 
     context.succeed({success: true, username: username}); 
    }); 
}; 

注意context.succeed现在已嵌入异步回调中,这样,只有当数据已经返回的数据传递。

+0

谢谢迈克尔,但我试图运行它另一种方式,因为这是其他代码的一部分。进入出口。处理程序我有一个foreach,我需要运行查询到每个为了将此查询的结果添加到JSON ...我有第一个查询是你正在建议和每个data.Item结果我需要嵌套第二个查询。 –