MySQL no puede abrir la conexión después de llamar a connection.end() => Error: El grupo está cerrado.
config.js
const mysql = require('mysql2');
const config = {
host: 'localhost',
port: '3306',
user: 'root',
password: 'root',
database: 'krometal',
charset: "utf8mb4_bin",
multipleStatements: true
};
const connection = mysql.createPool(config);
connection.getConnection(function (err, connection) {
//connecting to database
if (err) {
logger.log('error', err);
console.log("MYSQL CONNECT ERROR: " + err);
} else {
logger.log('info', "MYSQL CONNECTED SUCCESSFULLY.");
console.log("MYSQL CONNECTED SUCCESSFULLY.");
}
});
module.exports = {
connection
}
login.js
javascript
const loginUser = async (req, callback) => {
connection.query(sql, async function (err, rows) => {
// logic
callback(result, 401, connection);
})
}
route.js
javascript
users.post('/users/login', async (req, res) => {
await loginUser(req, async (response, code, connection) => {
await connection.end();
res.status(code).send(response);
});
});
The problem is the first time I try login worked fine, but if I try the same login API again throw the error Error: Pool is closed.
Should I use the
connection.end()
method every time I open connection or mysql2 automatically end connection?
davy.ai
Según el código proporcionado, parece que el grupo de conexiones se está creando utilizando
mysql.createPool
, el cual gestiona las conexiones internamente y las libera automáticamente de vuelta al grupo cuando ya no son necesarias. Por lo tanto, llamar aconnection.end()
después de cada consulta es innecesario y puede resultar en errores como el mencionado anteriormente.Sin embargo, en el archivo
login.js
, la funcióncallback
es responsable de devolver el resultado y cerrar la conexión utilizandoconnection.end()
. Si esta función no se implementa correctamente o si no se llama alcallback
, puede resultar en fugas de conexión y errores como el mencionado anteriormente.Para solucionar el problema, asegúrate de que la función
callback
proporcionada aloginUser
siempre llame aconnection.end()
después de finalizar la consulta. También se recomienda utilizar bloques try-catch para manejar errores y liberar adecuadamente la conexión de vuelta al grupo, así:Al envolver la consulta en un bloque try-catch y hacer un rollback de la transacción en caso de error, la conexión se liberará adecuadamente de vuelta al grupo y se evitarán errores como el mencionado anteriormente.