Estoy trabajando para hacer un sitio web usando Nodejs, express y MySQL.
El problema al que me enfrento es que con la forma en que hago mi conexión y consultas a la base de datos en este momento, la conexión siempre está conectada, por lo que al final se agota el tiempo de espera. Intenté usar Pools pero tengo un problema cuando quiero que las conexiones se llamen a través de una función y luego devuelvan los resultados de la consulta para que no tenga que repetir el mismo código cada vez que quiera consultar eso específico consulta.
Así es como lo tengo ahora donde creo una conexión y luego, cada vez que se llama a una función, consulta el código y devuelve los resultados de la consulta.
const mysql = require('promise-mysql'); let db; (async function (err) { db = await mysql.createConnection({ host: dotenv.parsed.DB_HOST, user: dotenv.parsed.DB_LOGIN, password: dotenv.parsed.DB_PASSWORD, database: dotenv.parsed.DB_NAME, charset: dotenv.parsed.DB_CHAR, multipleStatements: dotenv.parsed.DB_MULTI }); if (err){console.log(err);}; process.on('exit', () => {db.end()}); })(); /** * @description gets the user's personnumber and password * @param {*} personnummer is the personal number issued by the Swedish government for the person in question */ async function getPat(personnummer) { let sql = "SELECT * FROM patients where personnummer=?"; let res = await db.query(sql, [personnummer]); return res; }Entonces, ¿cómo haría para hacer eso en las piscinas? porque cuando trato de hacer eso en una piscina
const connection = mysql.createPool({ host: dotenv.parsed.DB_HOST, user: dotenv.parsed.DB_LOGIN, password: dotenv.parsed.DB_PASSWORD, database: dotenv.parsed.DB_NAME, charset: dotenv.parsed.DB_CHAR, multipleStatements: dotenv.parsed.DB_MULTI }); /** * @description gets the user's personnumber and password * @param {*} personnummer is the personal number issued by the Swedish government for the person in question */ async function getPat(personnummer) { let patient; (await connection).getConnection(function (err, connection) { if (err) throw err; connection.query("SELECT * FROM patient where personnummer=?", [personnummer], function (err, result) { if (err) throw err; patient = result; }); }); return patient; }Lo que sucede en el código anterior está dentro de la conexión. función de consulta hay resultados, pero tan pronto como salimos de ella, los resultados están vacíos. Parece que no puedo entender cuál es la causa.
De acuerdo con la documentación , mysql.createPool() devuelve un pool de forma síncrona, por lo que no es necesario esperar.
// mysql.createPool() returns a pool synchronously const pool = mysql.createPool({ 'host': dotenv.parsed.DB_HOST, 'user': dotenv.parsed.DB_LOGIN, 'password': dotenv.parsed.DB_PASSWORD, 'database': dotenv.parsed.DB_NAME, 'charset': dotenv.parsed.DB_CHAR, 'multipleStatements': dotenv.parsed.DB_MULTI }); Lo que la documentación no le dice es cómo prometer pool.query() , y eso es lo que se está perdiendo.
Hay utilidades que prometen para usted, pero es bastante simple hacerlo manualmente.
/** * @description returns a Promise that delivers the user's personnumber and password (or Error) * @param {*} personnummer is the personal number issued by the Swedish government for the person in question */ async function getPat(personnummer) { return new Promise((resolve, reject) => { pool.query("SELECT * FROM patient where personnummer=?", [personnummer], function (err, result) { if (err) { reject(err); } else { resolve(result); } }); }); } Dado que getPat() devuelve Promise, la persona que llama debe usar la .then() o la sintaxis await para acceder al resultado.