我有一个让我疯狂的愚蠢问题.我有一个AWS lambda函数,它可以调用Dynamo db. 我希望将ddb.Scan操作放入函数中获取结果,然后将其传递给事件,但我无法在函数内返回结果… var aws = require('aws-
我希望将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 (err, data) {
这是你试图返回某个东西的第二个函数,但没有任何东西期望该函数返回任何东西,所以返回值被抛弃了.
请注意,对ddb.scan()的调用会立即返回,并且在检索到DynamoDB响应之后,稍后将调用传递给ddb.scan()的匿名回调函数.这是一个基本的异步编程概念,在成功编写NodeJS代码之前,您必须了解这一概念.您需要将回调传递给getName函数,一旦它具有名称值就可以调用,或者您可能需要重新考虑完全设计Lambda函数的方式.
我还建议使用AWS Lambda上提供的最新版本的NodeJS,以便您可以使用promises而不是回调,这使得使用异步函数更容易一些.