2016-07-25 104 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中的使用比您更多 –