2016-07-25 16 views
6

私はAuroraデータベースへの簡単な呼び出しを行うノードラムダ関数を作成しました。私はコンソールで関数をテストすると、クエリが返されます、私はログに結果を見ることができますが、コールバックは決して呼び出されるように見えないので、私のラムダ関数がタイムアウトします。私は問題が何であるか把握できません。ここの誰かが私に問題を指摘してくれることを願っています。次のようにAWSラムダ関数がコールバックを呼び出すことはありません

var mysql = require("mysql"); 

module.exports.handler = function(event, context, cb) { 
    console.log('start\n'); 
    var con = mysql.createConnection({ 
    ... 
    }); 
    console.log('call data\n'); 

    con.query('SELECT * FROM Tags', function(err, rows) { 
    console.log('Data received from Db:\n'); 
    console.log(rows); 

    console.log('calling callback'); 

    cb(null, 'Success'); 

    console.log('callback called'); 
    }); 
    console.log('data called\n'); 
}; 

結果CloudWatchのログは、私は問題を発見した...この質問へ

2016-07-25T14:20:05.343Z daf5cd6b-5272-11e6-9036-e73ad17006df start 
2016-07-25T14:20:05.398Z daf5cd6b-5272-11e6-9036-e73ad17006df call data 
2016-07-25T14:20:05.405Z daf5cd6b-5272-11e6-9036-e73ad17006df data called 
2016-07-25T14:20:05.440Z daf5cd6b-5272-11e6-9036-e73ad17006df Data received from Db: 
2016-07-25T14:20:05.440Z daf5cd6b-5272-11e6-9036-e73ad17006df [ 
    RowDataPacket { 
     id: 1, 
     externalId: 
     'a87ead34de7e', 
     orgId: 1, 
     name: 'lacinia sapien', 
     createdDate: 1448598369, 
     modifiedDate: 0 
    }, 
    ..., 
    RowDataPacket { 
     id: 50, 
     externalId: '9ebaaab372e3', 
     orgId: 1, 
     name: 'et commodo', 
     createdDate: 1451551837, 
     modifiedDate: 0 
    } 
] 
2016-07-25T14:20:05.483Z daf5cd6b-5272-11e6-9036-e73ad17006df calling callback 
2016-07-25T14:20:05.483Z daf5cd6b-5272-11e6-9036-e73ad17006df callback called 
END RequestId: daf5cd6b-5272-11e6-9036-e73ad17006df 
REPORT RequestId: daf5cd6b-5272-11e6-9036-e73ad17006df Duration: 300000.12 ms Billed Duration: 300000 ms Memory Size: 1024 MB Max Memory Used: 52 MB 
2016-07-25T14:25:05.341Z daf5cd6b-5272-11e6-9036-e73ad17006df Task timed out after 300.00 seconds 
+0

コールバック関数の本体を、 'cb'がどのように設定されているのと一緒に投稿できますか? –

+0

コールバック関数はノードバージョン4.3を使用するときにLambdaによって提供されます。私のロジックが終了すると、Lambdaがコールバック関数を呼び出して、ロジックが終了し、エラーまたは戻りデータが提供されていることを示します(それぞれコールバック関数のパラメータ)。 – mp2526

+0

クエリを送信する前に接続が終了するのを待っているわけではありません。 – kixorz

答えて

18

おかげで...

Lambda Timing out after calling callback

です。ノードmysqlモジュールは、ハンドラロジックによって明示的に閉じられていない限り、サーバが閉じるまで接続を開いたままにします。

したがって、ノードイベントループは空になることはなく、決してコールバックを返しません。上記のコードでは、私はした...

con.end(); 

コールバックを呼び出す前に、それは働いた。

+7

または、ラムダの上部にcontext.callbackWaitsForEmptyEventLoop = falseを追加します。 –

+0

ありがとう@MrkFldig!私はそれを忘れています...私のアプリはmongodb(mysqlの同じ動作)を使用します – Gonzalo

+0

また、ラッパーからのハンドラコンテナへの接続をラムダで再利用しています –

関連する問題