AWS Lamda中的节点功能超时

时间:2018-09-13 20:01:21

标签: node.js aws-lambda aws-sam-cli

我正在尝试调用在SAM本地环境中托管的Node.JS中编写的lamda函数。该功能正在连接到本地托管的MySQL数据库。

代码如下:

var mysql = require('mysql');

exports.handler = (event, context, callback) => {

    let id =  (event.pathParameters || {}).division || false;

    var con = mysql.createConnection({
        host: "host.docker.internal",
        user: "root",
        password: "root",
        database: "squashprod"
    });

    switch(event.httpMethod){

        case "GET":

                con.connect(function(err) {
                    if (err) throw err;
                    con.query("SELECT * FROM players where division_id = 1",
                        function (err, result, fields) {
                            if (err) throw err;
                            //console.log(result);
                            return callback(null, {body: "This message does not work"});
                        }
                    );
                });

//                  return callback(null, {body: "This message works"});

                break;


        default:
            // Send HTTP 501: Not Implemented
            console.log("Error: unsupported HTTP method (" + event.httpMethod + ")");
            callback(null, { statusCode: 501 })

    }

}

但是,回调(带有消息“此消息不起作用”)不会发出。我知道它正在调用DB,因为console.log调用会打印结果。运行此代码时,我在浏览器中收到内部服务器错误,并从SAM Local中收到以下消息:

2018-09-13 20:46:18 Function 'TableGetTest' timed out after 3 seconds
2018-09-13 20:46:20 Function returned an invalid response (must include one of: body, headers or statusCode in the response object). Response received: b''
2018-09-13 20:46:20 127.0.0.1 - - [13/Sep/2018 20:46:20] "GET /TableGetTest/2 HTTP/1.1" 502 -
2018-09-13 20:46:20 127.0.0.1 - - [13/Sep/2018 20:46:20] "GET /favicon.ico HTTP/1.1" 403 -

如果我将对数据库的调用注释掉,然后执行显示“此消息有效”的回调,则不会超时,并且该消息将出现在浏览器中

我知道数据库代码可以独立运行,因此很不错。我觉得它与回调有关,但是我对Node的了解不够深。

我要拔掉我留出的小头发。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,这就是我的解决方法。

第一个问题是时间不足以进行冷启动。

增加lambda的执行时间。初始连接设置将花费更长的时间。

进一步

查询完成后,您需要关闭连接。否则,它将不会使节点的事件循环保持为空,从而使lambda仍处于工作状态。

有两种解决方法:

  1. 一切完成后立即关闭所有连接。
  2. 使用Sequelize而不是计划mysql库。 Sequelize将有助于维护连接池并在连接之间共享。

https://www.npmjs.com/package/sequelize

希望有帮助。