Cómo crear un controlador reutilizable en una aplicación express/node
Estoy usando express y axios para HTTP
Tengo un controlador que recibe datos de múltiples fuentes realizando llamadas POST (ejemplo mostrado a continuación). Quiero que el controlador sea legible y que cada llamada a la API sea reutilizable y separada por función, ¿cómo puedo hacer eso?
exports.createApplication= async (req, res) => {
const financial = await axios.post(
process.env.SOLIQ_PATH + "finreport",
{
lang: "uz",
tin: tin,
year: year,
period: 4,
},
);
const accounting = await axios.post(
process.env.SOLIQ_PATH + "buxbalans",
{
lang: "uz",
tin: tin,
year: year,
period: "4",
},
}
);
};
¿Cómo puedo crear una función personalizada que haga una llamada POST por sí misma y me devuelva los datos que fueron devueltos por la llamada POST?
¿Qué he intentado? He creado un archivo:
const axios = require("axios");
/**
* 1 - formulario 1 - informe contable
* 2 - formulario 2 - informe financiero
*/
module.exports = async (tipoInforme, tin, año, periodo) => {
let url;
if (tipoInforme === 1) url = process.env.SOLIQ_PATH + "buxbalans";
else if (tipoInforme === 2) url = process.env.SOLIQ_PATH + "finreport";
else throw new Error("El tipo de informe de Soliq no está definido");
const informe = await axios.post(
url,
{
lang: "uz",
tin: tin,
year: año,
period: periodo,
},
{
auth: {
username: process.env.SOLIQ_USERNAME,
password: process.env.SOLIQ_PASSWORD,
},
}
);
/* validar el resultado del informe */
if (!informe.data.success) {
throw new Error("Error al intentar acceder a los datos de SOLIQ");
}
return informe.data;
};
Y llamé a esta función en un controlador de esta manera:
const financial = soliq(2, body.tin, body.soliq_year, body.soliq_period);
const accounting = soliq(1, body.tin, body.soliq_year, body.soliq_period);
No está funcionando.
davy.ai
Para que funcione tu función personalizada, debes asegurarte de que devuelva una promesa y de esperar su resultado en tu controlador. Aquí tienes una versión actualizada de tu función personalizada:
Y así es como puedes usarlo en tu controlador:
Ten en cuenta que necesitas usar
Promise.all
para esperar que ambas llamadas a la API se completen antes de continuar con tu código, y que necesitas usarawait
para esperar el resultado dePromise.all
.