我是aws lambda的新手,当我在这个简单的代码中使用dynamoDB时,我无法理解为什么我没有得到任何响应或错误:
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.KrakatoaProcessEventHandler = function(event, context) {
//console.log(JSON.stringify(event, null, 2));
dynamodb.listTables(function(err, data) {
console.log(err);
console.log(JSON.stringify(data, null, ' '));
});
event.Records.forEach(function(record) {
// Kinesis data is base64 encoded so decode here
payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
console.log('Decoded payload:', payload);
});
context.succeed("Foo");
};
总体反应是:
START RequestId: 6f7b57f6-f3fc-11e4-9beb-f5a3878e8dc1
2015-05-06T14:30:28.653Z 6f7b57f6-f3fc-11e4-9beb-f5a3878e8dc1 Decoded payload: Hello, this is a test 123.
2015-05-06T14:30:28.711Z 6f7b57f6-f3fc-11e4-9beb-f5a3878e8dc1 result: "Foo"
END RequestId: 6f7b57f6-f3fc-11e4-9beb-f5a3878e8dc1
REPORT RequestId: 6f7b57f6-f3fc-11e4-9beb-f5a3878e8dc1 Duration: 478.16 ms Billed Duration: 500 ms Memory Size: 128 MB Max Memory Used: 13 MB
我尝试使用相同行为的dynamodb.putItem,一切似乎都是正确的,但我没有得到任何回应或错误。
提前致谢。
答案 0 :(得分:3)
您传递给dynamodb.listTables()
的匿名函数是callback。把它们想象成这样:
dynamodb.listTables(function(err, data) {
// Done listing tables, now do stuff!
});
// If you put code here, it's not guaranteed to run *after* listTables()
只要您拨打context.succeed()
,Lambda函数就会停止执行。因此,你打电话给这个"外面" listTables()
的{{1}},Lambda函数可能会在您从Dynamo获得任何结果之前停止。
正如您在评论中指出的那样,解决方案是执行以下操作:
dynamodb.listTables(function(err, data) {
// Done listing tables, now do stuff!
context.succeed('Foo');
});
因为你把context.succeed()
放在了回调中,这保证了函数只有在
异步编程在你掌握它之前是有点棘手的,所以读回调,你可以在将来避免这个错误!