进程在完成请求之前退出(Lambda + DynamoDB)

Process exited before completing request (Lambda + DynamoDB)

出于某种原因,我在完成请求错误之前退出进程。

这是我的代码:

var http = require('http');
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB();

function getUser(userid) {
    var q = ddb.getItem({
        TableName: "clients",
        Key: {
            ClientID: { S: userid } }
        }, function(err, data) {
            if (err) {
                console.log(err);
                return err;
            }
            else {
                console.log(data);
            }
    });
    //console.log(q);
}


exports.handler = function(event, context) {
    getUser('user23');
    console.log("called DynamoDB");

};

谷歌搜索后,一些人建议将超时时间更改为更长的时间。我做了一分钟。

然而函数只用了:

Duration : 2542.23 ms

我也检查并仔细检查了 table 名称和密钥名称等...

控制台日志是这样的:

2016-03-21T04:09:46.390Z - Received event

2016-03-21T04:09:46.751Z - called DynamoDB

2016-03-21T04:09:47.012Z - {}

END RequestId: id123

谁能看出为什么这不起作用?

编辑

按照下面的答案我试过了:

    console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
    console.log(JSON.stringify(event, null, '  '));
    dynamodb.listTables(function(err, data) {
      console.log(JSON.stringify(data, null, '  '));
    });
    var tableName = "clients";
    var datetime = new Date().getTime().toString();
    dynamodb.getItem({
        TableName: tableName,
        Key: {
            ClientID: { S: "gr5f4sgnca25hki" } }

    }, function(err, data) {
        if (err) {
            context.done('error','putting item into dynamodb failed: '+err);
        }
        else {
            context.done(data);
        }
    });
};

但现在我的回复是:

"errorMessage": "[object Object]"

我想做的是:检查数据库中是否存在项目。从条目中获取参数(如果存在),然后对参数进行处理

您需要向 Lambda 发出函数结束信号。

Important

To properly terminate your Lambda function execution, you must call context.succeed(), context.fail(), or context.done() method. If you don't, either your Lambda function will continue to run until the Node.js event queue is empty, or your Lambda function times out.

这是一个例子: https://gist.github.com/markusklems/1e7218d76d7583f1f7b3

首先,context.done 需要一个 Error 对象作为第一个参数,而不是包含单词 "error" 的字符串。 其次,如果Error对象为null或undefined,则终止将被视为成功。

现在,考虑你的回调函数:

function (err, data)
{
    if (err) {
       context.done('error', 'putting item into dynamodb failed: ' + err);
    }
    else {
       context.done(data);
    }
}

如果您有错误,那么您的 lambda 将以失败终止,这是预期的,但是您将得到的 errorMessage 将只是 "error",这没有太多信息.

如果您没有错误,那么您的 lambda 也会因失败而终止 ,因为您将 data 作为 第一个参数context.done,记住第一个参数总是Error对象。

要解决此问题,您只需执行以下操作:

function (err, data)
{
    if (err) {
       context.done(err);
    } else {
       context.done(null, data);
    }
}

甚至更好:

function (err, data)
{
    context.done(err, data);
}

如果您不想立即处理该项目而只是 return 它,您可以使用 context.done 作为 DynamoDB 操作的回调函数:

dynamodb.getItem({
    TableName: tableName,
    Key: {
        ClientID: { S: "gr5f4sgnca25hki" }
    }
}, context.done);
"errorMessage": "[object Object]"

可以通过如下小改动解决

function(err, data) {
    if (err) {
        context.done(err);
    }
    else {
        context.succeed(data);
    }
});

注意 context.succeed 与 context.done()

的区别()