2016-07-25 13 views
6

Stworzyłem funkcję lambda węzła, która wykonuje proste wywołanie do bazy danych Aurora. Kiedy testuję funkcję w konsoli, zapytanie zwraca, widzę wyniki w dzienniku, ale wywołanie zwrotne nigdy nie wydaje się być wywoływane, więc moja funkcja lambda wygasa. Nie mogę zrozumieć, na czym polega problem. Mam nadzieję, że ktoś tutaj może wskazać mi problem.AWS Funkcja Lambda nigdy nie wywołuje oddzwonienia

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'); 
}; 

Powstały dziennika Cloudwatch jest następujący ...

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

Czy możesz opublikować treść swojej funkcji zwrotnej wraz z zapełnianiem 'cb'? –

+0

Funkcja wywołania zwrotnego jest zapewniona przez Lambda, gdy używana jest wersja węzła 4.3. Po zakończeniu logiki wywołuję funkcję zwrotną podaną przez Lambda, aby wskazać, że logika została zakończona i podano wszelkie błędy lub dane zwrotne (odpowiednio parametry funkcji zwrotnej). – mp2526

+0

Nie czekasz na zakończenie połączenia przed wysłaniem zapytania. – kixorz

Odpowiedz

18

Dzięki to pytanie ...

Lambda Timing out after calling callback

znalazłem problem. moduł mysql Node utrzymuje połączenie otwarte, dopóki serwer go nie zamknie, chyba że zostanie jawnie zamknięte przez logikę modułu obsługi.

Tak więc pętla zdarzeń węzła nigdy nie opróżnia się, więc nigdy nie zwraca wywołania zwrotnego. W powyższym kodzie wykonałem ...

con.end(); 

przed wywołaniem oddzwonienia i zadziałało.

+7

ALBO dodajesz context.callbackWaitsForEmptyEventLoop = false na górze twojej Lambdy! –

+0

Dzięki @MrkFldig! Zapomniałem, że ... moja aplikacja używa mongodb (to samo zachowanie mysql) – Gonzalo

+0

Również przekazałbym połączenie z opakowania do kontenerów handlerka, które są ponownie używane dużo częściej niż w Lambda –