const getDbInfo = (anArrayOfIDs) => { return new Promise(function(resolve, reject){ let arrayOfDbInfoToSendBack = []; for(let i = 0; i <= anArrayOfIDs.length-1; i++){ pool.query( "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" + anArrayOfIDs[i] + "';", async(err, res) => { if (err) { console.log("error: ", err); } else { for(let k = 0; k <= res.length-1; k++){ arrayOfDbInfoToSendBack.push(res); } resolve(arrayOfDbInfoToSendBack); } } ); } }); }Se esperaba que esta función devolviera una matriz de objetos con información. Sospecho que estoy usando resolve incorrectamente y devolviendo una matriz de solo 1 objeto cuando quiero una matriz de múltiples objetos en ella.
En SQL, cada consulta es una promesa, por lo que no es necesario consultar dentro de una promesa. Para simplificar la resolución, puede usar async/await.
//Setting function asynchronous const getDbInfo = async (anArrayOfIDs) => { let arrayOfDbInfoToSendBack = []; for(let i = 0; i <= anArrayOfIDs.length-1; i++){ let query = "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" + anArrayOfIDs[i] + "';" //Awaiting until the sql query resolved or rejected await pool.query(query,(err, res)=>{ if (err) console.error(err) else { for(let k = 0; k <= res.length-1; k++){ arrayOfDbInfoToSendBack.push(res); } }) } } Por cierto, no estoy seguro de que esta función funcione si la declaras fuera de tu ruta. Porque Nodejs intentará ejecutarlo una vez que el servidor esté activo y falle porque no puede encontrar un argumento de anArrayOfIDs . Entonces, use la función dentro de su ruta. Si tiene que usarlo con frecuencia, mueva su función a un archivo .js diferente, expórtelo desde allí y luego impórtelo como middleware donde desee usarlo.
¿Funciona este fragmento de código?
const getDbInfo = (anArrayOfIDs) => { return new Promise(function(resolve, reject) { pool.query("SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID IN (?)", anArrayOfIDs , (err, res) => { if (err) { console.log("error: ", err); reject(err); return; } resolve(res) } ); }); }Si el único objeto que se devuelve es el correcto, entonces el problema puede originarse en el hecho de que está resolviendo dentro del bucle for. Eso significa que solo se llama a la primera iteración y luego, como la promesa ya se resolvió, las siguientes iteraciones son obsoletas considerando la naturaleza de devolución de llamada de pool.query . Supongo que esperar antes de que pueda resolver el problema
const getDbInfo = (anArrayOfIDs) => { return new Promise(async function (resolve, reject) { let arrayOfDbInfoToSendBack = []; anArrayOfIDs.forEach(async (id) => { await pool.query( "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" + id + "';", async (err, res) => { if (err) { console.log("error: ", err); } else { for (let k = 0; k <= res.length - 1; k++) { arrayOfDbInfoToSendBack.push(res); } } } ); resolve(arrayOfDbInfoToSendBack); }); }); }