为什么我在通过 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 返回结果并且您使用它执行操作后才完成。

异步编程有点棘手,直到您掌握了它,所以请仔细阅读回调,您以后可以避免这种错误!