He intentado diferentes formas de enviar datos en matrices pero muestra nulo. Estoy seguro de que esto se debe a que la respuesta se activa antes de que regrese la respuesta real. Bueno, esta es mi conjetura! Puedo estar equivocado. Quiero saber la mejor práctica para hacer esto.
Mi resultado esperado en la carga útil:
data: { allCountries: [{TotalCountries: 12}] allStates: [{StateId: "15327", STR: "Form",…}, {StateId: "15326", STR: "Form",…},…] AllCities: [,…] AllCust: {Id: "1825",…} }Ahora, en el controlador nodejs, tengo 4 funciones.
exports.getAllDetails = async (req, res) => { if (!req.query.clientId) { return res.status(406).send({ success: false, message: "ID is required" }) } let id = req.query['custId']; let allCountries= await getAllCountries(req, res, id) // let allStates= this.getStates(req, res, id); // let allCities= this.getAllCities(req, res, id); // let custDetails= this.getCustDetails(req, res, id); return res.send({ success: true, data: [allCountries] [allStates], [AllCities], [AllCust] }) }Ahora he creado funciones separadas para todos. es decir
async function getAllCountries(req, res, id) { let allCountries; allCountries= `SELECT query..` connection.query(allCountries, (err, result) => { if (result) { if (result.length > 0) { return result; } else { res.status(204).send({ success: false, message: `No data found.`, }); } } }); }¿Obtengo una matriz nula en el resultado? ¿Alguien puede decirme la mejor manera de hacer esto?
Porque está intentando devolver datos de la función de devolución de llamada:
async function getAllCountries(req, res, id) { let allCountries; allCountries= `SELECT query..` connection.query(allCountries, (err, result) => { if (result) { if (result.length > 0) { return result; // this won't work because it is inside callback function. } else { res.status(204).send({ success: false, message: `No data found.`, }); } } }); }necesita devolver el objeto de promesa:
async function getAllCountries(id) { let allCountries; allCountries= `SELECT query..` return new Promise((resolve) => { connection.query(allCountries, (err, result) => { if (result) { if (result.length > 0) { resolve(result); } else { resolve(null); } } }); }); }también donde estás usando esta función:
let allCountries= await getAllCountries(id); if (allCountries == null) { return res.status(204).send({ success: false, message: `No data found.`, }); }Le recomendaré que comience a usar try/catch para manejar los errores en lugar de que todas sus funciones pasen el param req/res, con esta solución su código será más legible.
function getAllCountries(req, res, id) { return new Promise((res, rej) => { let allCountries; allCountries = `SELECT query..`; connection.query(allCountries, (err, result) => { if (err) { rej(err); } if (result.length === 0) { rej({ success: false, message: `No data found.`, }); } res(result); }); }); }en su función principal:
exports.getAllDetails = async (req, res) => { if (!req.query.clientId) { return res.status(406).send({ success: false, message: 'ID is required', }); } try { let id = req.query['custId']; let allCountries= await getAllCountries(id) ... return res.send({ success: true, data: { allCountries, //as you want this as array wrap the allCountries as [allCountries] ... } }) } catch (err) { return res.status(400).send(err); } };