1

私は 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 を試してみましたが、すべてが正しいようですが、応答やエラーが発生しません。

前もって感謝します。

4

1 に答える 1

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()

Lambda 関数は、 を呼び出すとすぐに実行を停止しますcontext.succeed()。したがって、これを の「外部」で呼び出すためlistTables()、Dynamo から結果を取得する前に Lambda 関数が停止する場合があります。

コメントで指摘したように、解決策は次のようなことです。

dynamodb.listTables(function(err, data) {
    // Done listing tables, now do stuff!

    context.succeed('Foo');
});

context.succeed()コールバック内にを配置するため、 Dynamo が結果を返し、ユーザーがそれを処理した後でのみ関数が完了することが保証されます。

非同期プログラミングは、コツをつかむまではややこしいので、コールバックをよく読んでおけば、将来このエラーを回避できます!

于 2015-05-06T18:28:22.610 に答える