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

时间:2016-10-08 21:19:00

标签: node.js amazon-web-services amazon-dynamodb aws-lambda

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

我希望将ddb.Scan操作放入函数中获取结果,然后将其传递给事件,但我无法在函数内返回结果...

endpattern

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

2 个答案:

答案 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现在嵌入在异步回调中,因此只有在返回数据时才会传递数据。