es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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 a connection.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ón callback es responsable de devolver el resultado y cerrar la conexión utilizando connection.end(). Si esta función no se implementa correctamente o si no se llama al callback, 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 a loginUser siempre llame a connection.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í:

    const loginUser = async (req, callback) => {
      try {
        connection.query(sql, async function (err, rows) {
            // lógica
            callback(result, 401, connection);
        });
      } catch (error) {
        console.log(error);
        connection.rollback(() => {
          callback('Error', 500, connection);
        });
      }
    }
    

    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.

Comments are closed.