Проблема с mysql connect() и end() (node JS)

233
30 июля 2021, 05:10

Сегодня весь вечер пытался решить дурацкую проблему с закрытием соединения. Есть функция, которая запускается через setInterval (код будет ниже). И в этой функции каждый раз создается подключение к БД и закрывается. Но это так должно быть. На деле если добавлять в конец функции con.end(), то при следующем подключении выдает:

Error: Cannot enqueue Query after invoking quit.

Если не закрывать подключение то в следующий раз оно просто скажет:

Error: Cannot enqueue Handshake after already enqueuing a Handshake.

Все бы ничего, я не дурак (вроде) и пытался сделать весь этот setTimeout внутри большого подключения, которое происходило бы после запуска файла, да вот только у меня timeout на 10 минут и оно дает ошибку о том, что долгое время подключения (пример не приведу, тк придется переделать код обратно).

У меня есть мысли с .then, после куска con.connect, но не получилось, и я решил не делать костыли, и просто спросить.

Было бы замечательно узнать в чем дело, ведь в этой теме я новенький.

Кусок кода с сервера:

let bodyOld = '';
const sendReq = () => {
// send request to gitHub
const request = https.request(options, res => {
    // get all request data from git and put it in 'body'
    let body = '';
    res.on('data', chunk => {
        body += chunk;
    });
    // if we have new data ( != data from DB )
    if (bodyOld != JSON.stringify(body)) {
        // bodyOld = JSON.stringify(body);
        // connect to mysql
        con.connect(err => {
            if (err) {
                console.log('Error ' + err)
            } else {
                // dell all old data in DB
                let sql = "DELETE FROM info";
                con.query(sql, (err, result) => {
                    err ? console.log('Error ' + err) :
                        console.log("All old data was deleted.");
                })
                // parce data and put in DB
                res.on('end', () => {
                    body = JSON.parse(body);
                    body.forEach(repo => {
                        let sql = "INSERT INTO info (name, url, description, language, create_at, last_update, size) VALUES ('" +
                            repo.name + "', '" + repo.html_url + "', '" + repo.description + "', '" + repo.language + "', '" +
                            repo.created_at.substring(0, 10) + "', '" + repo.updated_at.substring(0, 10) + "', '" + repo.size + "')";
                        con.query(sql, (err, result) => {
                            err ? console.log('Error ' + err) :
                                console.log("One new record.");
                        })
                    })
                })
            }
        })
        // con.end();
    }else{
        console.log('It alreadey update.');
        request.end();
        return;
    }
})
// check err
request.on('error', e => {
    console.error('Error is: ' + e);
});
request.end();
}
// setInterval every 10 minutes
setInterval(sendReq, 600);
Answer 1

Я нашел решение этой проблемы через mysql.createPool.

Создаем пулл:

// connect ot mysql data for PC
const optionsMysql = {
    host: "localhost",
    user: "root",
    password: "",
    database: 'guthub_proj'
}
const pool = mysql.createPool(optionsMysql)

Теперь при каждом запросе можно просто вытягивать из пула соединение:

pool.getConnection(function(err, con) {
    //code here...
}

На сколько я понял его можно не закрывать. И это то что мне было нужно.

READ ALSO
Сортировка по дате из строки. MySQL

Сортировка по дате из строки. MySQL

В таблице есть поле "Номер фактуры" вида AB/dd/mm/yyyy

159
Конвертация CSV в JSON на PHP

Конвертация CSV в JSON на PHP

Учусь конвертировать csv файлы в формат json на php(который тоже знаю не очень), большая просьба помочь с алгоритмоместь следующий csv фрагмент...

330
После заполнения полей формы отправить файл на указанную почту

После заполнения полей формы отправить файл на указанную почту

Есть простая форма с двумя полями: телефон и emailНужно автоматически отправлять файл на почту, которую укажет пользователь в поле email

151