У меня установлена лямбда-функция на AWS. Эта лямбда-функция построена поверх NodeJS. Эта лямбда-функция содержит несколько сценариев, каждый из которых запускается определенным событием. В последнее время я получаю следующую ошибку в случайное время и во время выполнения случайных сценариев (я не могу найти шаблон).
{
"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. Может ли кто-нибудь помочь мне найти вероятную причину этого?