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函数超时 以下是一个例子:
首先,
上下文。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
是表的分区键吗。。。。。我不认为柱子需要延长。非常感谢。