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

Node.js 如何从AWS DynamoDB-JS lambda中的函数返回查询结果,node.js,amazon-web-services,amazon-dynamodb,aws-lambda,Node.js,Amazon Web Services,Amazon Dynamodb,Aws 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: {

我有一个让我发疯的愚蠢问题。我有一个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) {
这里还有一个功能:

function getName(userid) {
function (err, data) {
这是第二个函数,在这个函数中,您试图返回一些东西,但是没有任何东西期望该函数返回任何东西,因此返回值被丢弃

请注意,对
ddb.scan()
的调用会立即返回,并且传递给
ddb.scan()
的匿名回调函数会在稍后的某个时间在检索到DynamoDB响应后被调用。这是一个基本的异步编程概念,在成功编写NodeJS代码之前,您必须理解它。您需要将回调传递给
getName
函数,该函数一旦具有name值就可以调用,或者您可能需要重新考虑Lambda函数的设计方式


我还建议您使用AWS Lambda上提供的最新版本的NodeJS,这样您就可以使用承诺而不是回调,这使得使用异步函数更加容易。

我注意到您的代码的第一件事是,
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.success现在嵌入到异步回调中,因此只有在返回数据时才传递数据。

非常感谢。想法是让它不异步。。。我遵循的是基于“docClient.scan(params,function(err,data){”的基本查询。可能我完全走错了路,但这是一个更大代码的一部分,我在一个表上有一个主查询,我想在构建JSON之前合并另一个表中的一些信息,
docClient.scan
函数也是异步的。您必须以某种方式处理这些AWS API调用的异步性质如果您想在NodeJS中编写代码,可以考虑“让它不异步”但这不是AWS NodeJS SDK提供给您的选项,也不是您编写NodeJS代码时使用的模型。谢谢Michael,但我尝试以另一种方式运行它,因为这是其他代码的一部分。在exports.handler中,我有一个foreach,我需要在foreach中运行查询,以便将此查询的结果添加到JSON…我有第一个查询,正如您所建议的,对于结果中的每个data.Item,我需要嵌套第二个查询。