AWS Lambda函数从未调用回调函数

10
我已创建了一个节点 Lambda 函数,简单调用了一下 Aurora 数据库。当我在控制台中测试函数时,查询返回了,我可以在日志中看到结果,但回调似乎从未被调用,所以我的 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 

你能够发布回调函数的主体以及如何填充“cb”吗? - Matt Houser
当使用Node版本4.3时,Lambda会提供回调函数。当我的逻辑完成后,我调用Lambda提供的回调函数来指示我的逻辑已经完成,并提供任何错误或返回数据(分别是回调函数的参数)。 - mp2526
在提交查询之前,您没有等待连接完成。 - adamkonrad
1个回答

25

由于这个问题...

Lambda 调用回调后超时

我找到了问题所在。Node mysql模块会一直保持连接直到服务器关闭,除非由处理程序逻辑显式关闭。

因此,Node事件循环永远不会清空,也永远不会返回回调函数。在上面的代码中,我做了一个...

con.end();

在调用回调函数之前它起作用了。


13
请在 Lambda 函数的顶部添加 context.callbackWaitsForEmptyEventLoop = false,然后返回已翻译的文本! - Mrk Fldig
谢谢@MrkFldig!我忘记了...我的应用程序使用mongodb(与mysql相同的行为) - Gonzalo
同时,我会将连接从包装器传递到处理程序容器中,因为在Lambda中,处理程序容器的重复使用要比您更多。 - Mrk Fldig
找到这个问题花了我太长时间,但这就是我的问题所在!使用mysql模块时也遇到了同样的问题。 - codyfraley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接