Mysql connection Pool Error: Can't add new command when connection is in closed state
При попытке сделать execute напрямую к pool возникает следующая ошибка:
Error: Can't add new command when connection is in closed state
До этого уже было выполнено несколько execute напрямую к pool.
Свойство объекта пула соединений pool._closed показывает, что пул не закрыт. Посоветуйте, плз, в каком направлении двигаться и в чём может быть причина?
Показываю участок кода на котором происходит проблема:
const mysql = require("mysql2");
const gPool = createPoolDB(10)
function createPoolDB(limit){
const pool = mysql.createPool({
connectionLimit: `${limit}`,
host: "localhost",
user: "user",
database: "users",
password: "password"
}).promise()
return pool;
}
app.post('/labData', (request, response) => { // обнова
let date = getDate() // получает текущие дату и время
let session = request.sessionID
let nameTable = users[session].user + '_progress'
saveErrLog(gPool.pool._closed, date, 'labData-1', 'test')
try {getLabData()}
catch(err){saveErrLog(err, date, 'labData', 'test')}
saveErrLog(gPool.pool._closed, date, 'labData-after', 'test')
async function getLabData(){
users[session].exec.selectLabData = {
userProgress: `SELECT * FROM ${nameTable}`,
usersStage2: `SELECT * FROM users_stage2 WHERE nickname = '${users[session].user}'`,
}
let obj = users[session].exec.selectLabData
let data = await gPool.execute(obj.userProgress)
.catch(err => {saveErrLog(err, date, 'execGetLabData1', 'errorLogDB')})
saveErrLog(gPool.pool._closed, date, 'labData-SELECT-1', 'test')
data = data[0]
obj.userProgress = null
let data2 = await gPool.execute(obj.usersStage2)
.catch(err => {saveErrLog(err, date, 'execGetLabData2', 'errorLogDB')})
data2 = data2[0]
data2.forEach((item)=>{
if(item.nickname == users[session].user){RP = item.ResPoints}
})
obj.usersStage2 = null
}
})
function saveErrLog(err, date, name, logFile){
if(logFile != 'test' && logFile != 'test2'){
try {fs.appendFileSync(`${logFile}.txt`, `${date}: "${name}", ${err.stack}\n`)}
catch(error){
let str = error.name + error.message
fs.appendFileSync(`errorLogAppendFile.txt`, `${date}: "", ${str}\n`)
}
}
err = JSON.stringify(err)
try {fs.appendFileSync(`${logFile}.txt`, `${date}: "${name}", ${err}\n`)}
catch(error){
let str = error.name + error.message
fs.appendFileSync(`errorLogAppendFile.txt`, `${date}: "", ${str}\n`)
}
}
Записанный лог в файле test:
- 21.04, 12:59: "leaderboard-SELECT", false
- 21.04, 12:59: "leaderboard-SELECT-2", false
- 21.04, 12:59: "auth-SELECT", false
- 21.04, 12:59: "auth-SELECT-2", false
- 21.04, 12:59: "labData-1", false
- 21.04, 12:59: "labData-after", false
- 21.04, 12:59: "labData-SELECT-1", false
Данные ошибки:
21.04, 12:59: "execGetLabData1", Error: Can't add new command when connection is in closed state at PromisePool.execute (/home/nick/domains/domain.ru/public_html/myapp/node_modules/mysql2/lib/promise/pool.js:54:22) at getLabData (/home/nick/domains/domain.ru/public_html/myapp/app.js:523:32) at /home/nick/domains/domain.ru/public_html/myapp/app.js:510:9 at Layer.handle [as handle_request] (/home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/layer.js:95:5) at next (/home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/layer.js:95:5) at /home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/index.js:335:12) at next (/home/nick/domains/domain.ru/public_html/myapp/node_modules/express/lib/router/index.js:275:10)
21.04, 12:59: "execGetLabData1", {"message":"Can't add new command when connection is in closed state"}
Ответы (1 шт):
Наконец-то удалось справиться с проблемой. Оказалось всё дело в старой версии базы данных. Слишком подробно не разбирался, но на хостинге стоит MySQL 8.0.37-29, а Node.js версии 14.
Решение: заменил пакет mysql2 на mysql, вручную сделал к нему промис. Больше ничего не менял, пул соединений сразу заработал как надо.
P.S. Почти год танцев с бубном...