如何从AWS DynamoDB – JS lambda中的函数返回查询结果

我有一个愚蠢的问题,让我疯狂。 我有一个AWS lambda函数,可以调用Dynamo db。

我想有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}); }; 

有人能帮我理解我迷路的地方吗?

注意你在这里声明了一个函数:

 function getName(userid) { 

而另一个function在这里:

 function (err, data) { 

这是第二个函数,你试图返回的东西,但没有任何东西期望该函数返回任何东西,所以返回值被扔掉。

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

我还build议使用AWS Lambda上提供的最新版本的NodeJS,以便您可以使用promise而不是callback函数,这使得asynchronous函数的工作变得更加简单。

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

更重要的是, ddb.scan(...)是一个asynchronous函数,因此,你必须在callback中embedded你想要做的所有事情(在这个例子中是扫描结果)。

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

 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现在embedded在asynchronouscallback的内部,因此数据只在数据返回时才被传递。