NodeJS AWS Lambda:连接丢失:服务器关闭了连接

时间:2020-01-23 14:31:21

标签: mysql node.js aws-lambda

我在AWS上部署了lambda函数。此lambda函数建立在NodeJS之上。此lambda函数包含多个脚本,每个脚本均由某个事件触发。最近,我在随机时间和执行随机脚本的过程中一直收到以下错误(我找不到模式)。

{
    "errorType": "Error",
    "errorMessage": "Connection lost: The server closed the connection.",
    "code": "PROTOCOL_CONNECTION_LOST",
    "fatal": true,
    "stack": [
        "Error: Connection lost: The server closed the connection.",
        "    at Protocol.end (/var/task/node_modules/mysql/lib/protocol/Protocol.js:112:13)",
        "    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:97:28)",
        "    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:525:10)",
        "    at Socket.emit (events.js:203:15)",
        "    at Socket.EventEmitter.emit (domain.js:448:20)",
        "    at endReadableNT (_stream_readable.js:1143:12)",
        "    at process._tickCallback (internal/process/next_tick.js:63:19)"
    ]
}

我做了一些研究,发现此错误是由MySql生成的。但是,该错误会在脚本执行期间发生,而脚本甚至不会以任何方式与MySQL交互。

我为MySQL创建了一个包装器,以实现其某些功能。下面是代码:

const util = require('util');

let lib = {
  'mySqlWrapper': (config) => {
    if (!config) {
      config = {
        host: process.env.MYSQL_HOST,
        port: process.env.MYSQL_PORT,
        user: process.env.MYSQL_USERNAME,
        password: process.env.MYSQL_PASSWORD,
        database: process.env.MYSQL_DB_NAME,
        timezone: 'utc'
      }
    };
    let connection = require("mysql").createConnection(config);
    return {
      query(sql, args) {
        return util.promisify(connection.query).call(connection, sql, args);
      },
      close() {
        return util.promisify(connection.end).call(connection);
      },
      beginTransaction() {
        return util.promisify(connection.beginTransaction).call(connection);
      },
      commit() {
        return util.promisify(connection.commit).call(connection);
      },
      rollback() {
        return util.promisify(connection.rollback).call(connection);
      }
    };
  }
}

module.exports = lib;

请注意,我确定每个连接都是在执行脚本时创建的,并且在脚本结束之前已关闭。

此外,我确实更改了数据库的一些超时,例如:

Name                      Value
connect_timeout             5
delayed_insert_timeout      5
lock_wait_timeout           10
wait_timeout                5

我不知道此错误的原因,尤其是它是随机发生的(并非始终如此),甚至在执行与MySQL无关的脚本时也是如此。有人可以帮我找到可能的原因吗?

1 个答案:

答案 0 :(得分:1)

很难看到完整的功能。但是要明确一点,您是否在功能结束时关闭连接?您是否在处理程序功能之外建立连接?如果是这样,则它可以在同一台机器上的函数调用之间持续存在。您在mysql服务器上是否有可以检查的日志?