Error: Can't add new command when connection is in closed state
문제를 해결했다. 내가 쓴 코드때문에 해결되었는지는 모르겠지만, 더이상 pool 에 connect 하지 못해서 저 메세지가 뜨는 문제는 없어졌다.
기존 코드는 단순히 pool 을 만들고 export 하는 코드였다.
바뀐 코드는 서버가 실행될 때 만들어진 Pool 이 closed 될 경우 새로운 Pool 을 반환하는 코드다.
const mysql = require('mysql2/promise');
const dotenv = require('dotenv');
dotenv.config();
// 서버가 실행될 때 최초로 한번 만들어지는 pool
let pool = mysql.createPool({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
port: process.env.DATABASE_PORT,
connectTimeout: 10000,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
});
console.log('just created pool');
module.exports = {
getPool: async function () {
try {
// 기존의 pool 에 connect 성공 시 기존 pool 을 반환
const connection = await pool.getConnection();
await connection.beginTransaction();
console.log('Connected to existing pool.');
connection.release();
return pool;
} catch (err) {
try {
// connect 에 실패 시 새로운 pool 을 만듦
console.log('Failed to begin transaction.', err);
await pool.end();
console.log('Destroyed existing pool');
} catch (err1) {
console.log('Failed to end existing pool', err1);
} finally {
console.log('Creating a new pool...');
let newPool = mysql.createPool({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
port: process.env.DATABASE_PORT,
connectTimeout: 10000,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
});
// pool 을 갱신시키고 return
pool = newPool;
console.log('New pool created. Returing new pool.');
return pool;
}
}
},
};
이 문제를 연구하느라 mysql의 module 파일을 하나하나 들여다보았다... 힘들었지만 그래도 나름 재미있는 경험이었다. 덕분에 어떤 함수가 promise 를 return 하는 함수인지 알게 되어 적절하게 await 을 붙일 수 있었다.