2016-07-25 134 views
6

我已經創建了一個節點lambda函數,它可以對Aurora數據庫進行簡單的調用。當我在控制檯中測試函數時,查詢返回,我可以在日誌中看到結果,但回調似乎永遠不會被調用,所以我的lambda函數超時。我無法弄清楚問題所在。希望這裏有人能指點我這個問題。AWS Lambda函數從不調用回調函數

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

我發現這個問題。 Node mysql模塊保持連接處於打開狀態,直到服務器關閉它,除非它由處理程序邏輯顯式關閉。

所以節點事件循環從不清空,所以永遠不會返回回調。在上面的代碼中,我做了一個...

con.end(); 

在調用回調和它的工作。

+7

或者您在Lambda頂部添加context.callbackWaitsForEmptyEventLoop = false! –

+0

謝謝@MrkFldig!我已經忘記了...我的應用程序使用mongodb(與mysql的行爲相同) – Gonzalo

+0

另外,我將包裝器中的連接傳遞給處理程序容器在Lambda中的使用比您更多 –