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