【问题标题】:Process exited before completing request (Lambda + DynamoDB)完成请求前进程退出(Lambda + DynamoDB)
【发布时间】:2017-07-02 02:37:50
【问题描述】:

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

这是我的代码:

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]"

我想要做的是:检查项目是否存在于数据库中。如果存在则从条目中获取参数,然后对参数做一些事情

  • 谁能帮帮我?

【问题讨论】:

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


    【解决方案1】:

    首先,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",这并没有太多信息。

    如果您没有错误,那么您的 lambda 也将在失败中终止,因为您将 data 作为 第一个参数 传递给 @ 987654329@,并记住第一个参数始终是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);
    

    【讨论】:

    • 谢谢。那解决了那个错误。但是,日志中的结果现在只是 ** { } ** - 有什么想法吗?
    • @JamesG 空数据对象意味着您的表中没有带有 ClientID 的项目。您确定该项目存在吗?
    • 检查了表格,状态为活动。在表中有 ClientID 下的项目,它有值
    • @JamesG 与本例中的 exact ClientID 是否相同?另外,ClientID 是表的分区键吗?
    • 该死的骗子.....我没看到专栏 |需要延长。谢谢。
    【解决方案2】:

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

    重要

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

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

    【讨论】:

    • 那是你的github吗?
    • 能否在控制台中记录数据?
    【解决方案3】:
    "errorMessage": "[object Object]"
    

    可以通过如下小改动解决

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

    注意 context.succeed 与 context.done() 的不同之处()

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多