当我通过lambda函数使用dynamodb时,为什么我没有得到错误或结果

时间:2015-05-06 15:19:37

标签: amazon-web-services amazon-dynamodb aws-lambda

我是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,一切似乎都是正确的,但我没有得到任何回应或错误。

提前致谢。

1 个答案:

答案 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()放在了回调中,这保证了函数只有在 返回结果后你才能完成

异步编程在你掌握它之前是有点棘手的,所以读回调,你可以在将来避免这个错误!