【问题标题】:AWS Lambda function never calls the callbackAWS Lambda 函数从不调用回调
【发布时间】:2016-11-28 23:28:07
【问题描述】:

我创建了一个对 Aurora 数据库进行简单调用的节点 lambda 函数。当我在控制台中测试函数时,查询返回,我可以在日志中看到结果,但回调似乎从未被调用,因此我的 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 的填充方式?
  • 使用node 4.3版本时,Lambda提供回调函数。当我的逻辑完成后,我调用 Lambda 提供的回调函数来表明我的逻辑已经完成并且提供了任何错误或返回数据(分别为回调函数的参数)。
  • 在提交查询之前,您无需等待连接完成。

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

感谢这个问题...

Lambda Timing out after calling callback

我发现了问题。 Node mysql 模块保持连接打开,直到服务器关闭它,除非它被处理程序逻辑显式关闭。

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

con.end();

在调用回调之前,它起作用了。

【讨论】:

  • 或者你在 Lambda 的顶部添加 context.callbackWaitsForEmptyEventLoop = false!
  • 感谢@MrkFldig!我忘记了...我的应用程序使用 mongodb(与 mysql 相同的行为)
  • 另外,我会将连接从包装器传递到处理程序,容器在 Lambda 中的重用率比你多得多
  • 我花了太长时间才找到这个,但这是我的问题!使用 mysql 模块时同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多