Estoy usando nodejs y mysql2. Estoy almacenando todas mis consultas dentro de una clase. Cuando hago console.log los resultados, puedo ver los datos correctamente, sin embargo, cuando uso una declaración de devolución para devolver los datos, no estoy definido. Creo que necesito usar promesas, pero no estoy seguro de cómo hacerlo correctamente. Esto es lo que tengo actualmente que está regresando indefinido,
viewManagerChoices() { const sql = `SELECT CONCAT(first_name, ' ', last_name) AS manager, id FROM employee WHERE manager_id IS NULL`; db.query(sql, (err, rows) => { if (err) throw err; const managers = rows.map(manager => ({ name: manager.manager, value: manager.id })); managers.push({ name: 'None', value: null }); return managers; }); }; Este es mi intento de usar promesas que regresan como Promise {<pending>} ,
viewManagers() { return new Promise((resolve, reject) => { const sql = `SELECT CONCAT(first_name, ' ', last_name) AS manager FROM employee WHERE manager_id IS NULL`; db.query(sql, (error, results) => { if (error) { console.log('error', error); reject(error); } const managers = []; for (let i = 0; i < results.length; i++) { managers.push({ name: results[i].manager, value: i+1 }); } managers.push({ name: "None", value: null }); resolve(managers); } ) }) }Mi clase se llama Query y estoy llamando a estos métodos haciendo,
const query = new Query(); query.viewManagerChoices(); query.viewManagers();Su implementación para viewManagers es correcta, sin embargo, las promesas no hacen que las llamadas sean sincrónicas.
O necesita usar la then de llamada o esperar el resultado en un contexto asíncrono.
const query = new Query(); query.viewManagers().then((managers) => { // do stuff here }).catch((error) => console.error(error.message));o
async someFunc() { const query = new Query(); try{ const managers = await query.viewManagers(); }catch(error){ console.error(error.message); } } Una vez que usa la promesa, no puede simplemente obtener un valor devuelto sin async/await o then marcar. Una vez que es una promesa, el flujo continúa como el original.
Por ejemplo:
// This is promise too because it has async flag. // You cannot make it sync if you use promise in it async myFunc(){ const const query = new Query(); const managers = await query.viewManagers(); return managers; } // It actually returns Promise<...> // Now if you want to use myFunc in another function // You need to do it the same way again async anotherFunc(){ const something = await myFunc(); return something; // Returns promise }Puedes leer más sobre las promesas aquí