为什么我在通过 lambda 函数使用 dynamodb 时没有收到错误或结果
Why am I not getting errors or result when i use dynamodb through lambda function
我是 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 同样的行为,一切似乎都是正确的,但我没有得到任何响应或错误。
提前致谢。
您传递给 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()
Lambda 函数将在您调用 context.succeed()
后立即停止执行。因此,由于您调用 listTables()
的 "outside",Lambda 函数可能会在您从 Dynamo 获得任何结果之前停止。
正如您在评论中指出的那样,解决方案是执行如下操作:
dynamodb.listTables(function(err, data) {
// Done listing tables, now do stuff!
context.succeed('Foo');
});
因为您将 context.succeed()
放在回调中,这保证函数仅在 Dynamo 返回结果并且您使用它执行操作后才完成。
异步编程有点棘手,直到您掌握了它,所以请仔细阅读回调,您以后可以避免这种错误!
我是 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 同样的行为,一切似乎都是正确的,但我没有得到任何响应或错误。
提前致谢。
您传递给 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()
Lambda 函数将在您调用 context.succeed()
后立即停止执行。因此,由于您调用 listTables()
的 "outside",Lambda 函数可能会在您从 Dynamo 获得任何结果之前停止。
正如您在评论中指出的那样,解决方案是执行如下操作:
dynamodb.listTables(function(err, data) {
// Done listing tables, now do stuff!
context.succeed('Foo');
});
因为您将 context.succeed()
放在回调中,这保证函数仅在 Dynamo 返回结果并且您使用它执行操作后才完成。
异步编程有点棘手,直到您掌握了它,所以请仔细阅读回调,您以后可以避免这种错误!