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

时间:2016-03-21 04:18:02

标签: json amazon-web-services amazon-dynamodb aws-lambda

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

这是我的代码:

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");

};

谷歌搜索后,有人建议将时间更改为更高的金额。我做了一分钟。

然而这个功能只采取了:

  

持续时间:2542.23毫秒

我还检查并仔细检查了表名和密钥名等......

控制台日志包含:

  

2016-03-21T04:09:46.390Z - 收到活动

     

2016-03-21T04:09:46.751Z - 名为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]”

我要做的是:检查项目是否存在于数据库中。从条目中获取参数(如果存在),然后使用参数

执行某些操作
  • 任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

如果您有错误,那么您的lambda将在失败时终止,这是预期的,但您获得的errorMessage将只是"error",这没有多少信息。< / p>

如果您没有错误,那么您的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);
}

如果您不想处理该项并立即将其返回,则可以使用context.done作为DynamoDB操作的回调函数:

dynamodb.getItem({
    TableName: tableName,
    Key: {
        ClientID: { S: "gr5f4sgnca25hki" }
    }
}, context.done);

答案 1 :(得分:1)

你需要发出Lambda函数结束的信号。

  

重要

     

要正确终止Lambda函数执行,必须调用context.succeed(),context.fail()或context.done()方法。如果不这样做,则Lambda函数将继续运行,直到Node.js事件队列为空,或者Lambda函数超时。

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

答案 2 :(得分:0)

"errorMessage": "[object Object]"

可以通过如下的小改变来解决

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

注意context.succeed与context.done()

的不同之处