出于某种原因,我在完成请求错误之前退出了进程。
这是我的代码:
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]”
我要做的是:检查项目是否存在于数据库中。从条目中获取参数(如果存在),然后使用参数
执行某些操作答案 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()
的不同之处