我有一个让我发疯的愚蠢问题。我有一个AWS lambda函数,它可以调用Dynamo db。
我希望将ddb.Scan操作放入函数中获取结果,然后将其传递给事件,但我无法在函数内返回结果...
endpattern
有人可以帮我理解我迷路的地方吗?
答案 0 :(得分:1)
注意你如何在这里声明一个函数:
function getName(userid) {
另一个功能在这里:
function (err, data) {
这是你试图返回某个东西的第二个函数,但没有任何东西期望该函数返回任何东西,所以返回值被抛弃了。
请注意,对ddb.scan()
的调用会立即返回,并且在检索到DynamoDB响应之后,稍后会调用传递给ddb.scan()
的匿名回调函数。这是一个基本的异步编程概念,在成功编写NodeJS代码之前,您必须了解这一概念。您需要将回调传递给getName
函数,一旦它具有名称值就可以调用,或者您可能需要重新考虑完全设计Lambda函数的方式。
我还建议使用AWS Lambda上提供的最新版本的NodeJS,以便您可以使用promises而不是回调,这样可以更轻松地使用异步函数。
答案 1 :(得分: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现在嵌入在异步回调中,因此只有在返回数据时才会传递数据。