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