NODEJS EXPRESS приложение падает из-за дисконекта к БД

Падает приложение на сервере, запускают с помощью PM2. Может работать иногда день, два, иногда каждый день крашится. Выводил в лог память, в среднем от 100 до 400мб жрет на VDS 8gb. В логах причина - дисконект с мускулем. Есть предположение что неправильно организую работу с базой. Соединение нигде не завершаю с помощью .end() метода, файл работы с бд прикладываю. Нагрузка на сервер нулевая, нет запросов. Только тестовые от меня. Может быть из-за того, что не трогаю - по времени истечения база разрывает соединение? Значит должно как-то делаться переподключение? Что тогда в коде не так?( Помогите пожалуйста..

const config = require('../config.json');
const mysql = require('mysql2');

const pool = mysql.createPool({
  connectionLimit : 20,
  host          : config.db.host,
  user          : config.db.user,
  password      : config.db.password,
  database      : config.db.dbname,
  debug         : false,
    port                : config.db.port,
  charset           : "utf8mb4"
});

module.exports.query = function(query, params, callback) {
  pool.getConnection(function(err, connection) {
    if (err) throw err;

    connection.query(query, params, function(err, rows) {
      connection.release();
      if (!err) {
        callback(null, {rows});
      }
    });
    connection.on('error', function(err) {
      throw err;
    });
  });
};

module.exports.pool = pool;


Ответы (1 шт):

Автор решения: Eugene X

В общем накидал некоторый примерщик, как вообще это было-бы красиво и работоспособно.

Ты кидаешь throw err и он улетает прямо в верхний стек. который без сatch конечно грохает программу. Золотое правило программирования! Все exceptions должны быть пойманы! Именно по той-же причине в Java нельзя сделать throw без обработчика catch.

const mysql = require("mysql2");
const express = require("express");
const pool = mysql.createPool(require("./config").db);
const app = express();

app.use((req, res, next) => {

    pool.getConnection((err, connection) => {
        if (err) {
            console.error(err);
            res.end("We have database connection problems, sorry");
            return;
        }
        res.on("finish", () => {
            connection.release();
        });

        connection.on("error", (err) => {
            console.error(err);
            res.end("We have database connection problems, sorry");
        });

        req.dbquery = function(query, params) {
            return new Promise((resolve, reject) => {
                connection.query(query, params, (err, rows) => {
                    if (err) {
                        console.error(err);
                        reject(err);
                        return;
                    }
                    resolve(rows);
                });
            });
        }

        next();
    });
});



app.get("/", async (req, res) => {
    try {
        let tables = await req.dbquery("SELECT * FROM `TABLES` WHERE `TABLE_SCHEMA` = ?", ["information_schema"]);
        res.json(tables);
    } catch (err) {
        res.end("error page");
    }
})


main().catch(console.error);
async function main() {
    app.listen(8080);
}
→ Ссылка