Json 进程在完成请求之前退出(Lambda&x2B;DynamoDB)

Json 进程在完成请求之前退出(Lambda&x2B;DynamoDB),json,amazon-web-services,amazon-dynamodb,aws-lambda,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: useri

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

这是我的密码:

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-称为发电机B

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

结束请求ID: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”:“[对象]”

我试图做的是:检查数据库中是否存在该项。如果存在,则从条目中获取参数,然后对参数执行某些操作

  • 有人能帮我吗

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

重要

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

以下是一个例子:

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

重要

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

以下是一个例子:

首先,
上下文。done
要求将
Error
对象作为第一个参数,而不是包含单词
“Error”
的字符串。 其次,如果
Error
对象为null或未定义,则终止将被视为成功

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

function (err, data)
{
    if (err) {
       context.done('error', 'putting item into dynamodb failed: ' + err);
    }
    else {
       context.done(data);
    }
}
如果您有错误,那么lambda将在故障中终止,这是意料之中的,但是您将得到的
错误消息将只是
“error”
,信息量不大

如果没有错误,那么lambda也将在失败时终止,因为您将
数据
作为第一个参数传递给
上下文。完成
,请记住第一个参数始终是
错误
对象

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

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

首先,
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将在故障中终止,这是意料之中的,但是您将得到的
错误消息将只是
“error”
,信息量不大

如果没有错误,那么lambda也将在失败时终止,因为您将
数据
作为第一个参数传递给
上下文。完成
,请记住第一个参数始终是
错误
对象

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

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);
可以通过以下小改动来解决

function(err, data) {
    if (err) {
        context.done(err);
    }
    else {
        context.succeed(data);
    }
});
注意context.success()与context.done()的不同之处

可以通过以下小改动来解决

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

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

这是您的github吗?请在控制台中记录数据吗?这是您的github吗?请在控制台中记录数据吗?谢谢。这就解决了这个错误。然而,日志中的结果现在只是**{}**-有什么想法吗?@JamesG空数据对象意味着表中没有具有
ClientID
的项。是否确定该项存在?已检查表,状态为“活动”。表中有ClientID下的项,它具有values@JamesG它是否具有与本例中相同的
ClientID
?另外,
ClientID
是表的分区键吗。。。。。我不认为柱子需要延长。谢谢,谢谢。这就解决了这个错误。然而,日志中的结果现在只是**{}**-有什么想法吗?@JamesG空数据对象意味着表中没有具有
ClientID
的项。是否确定该项存在?已检查表,状态为“活动”。表中有ClientID下的项,它具有values@JamesG它是否具有与本例中相同的
ClientID
?另外,
ClientID
是表的分区键吗。。。。。我不认为柱子需要延长。非常感谢。