es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    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("No se ha definido el tipo de informe Soliq");
    
      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,
          },
        }
      );
    
      /* validando el resultado del informe */
      if (!informe.data.success) {
        throw new Error("Error al intentar acceder a los datos de SOLIQ");
      }
    
      return informe.data;
    };
    

    Y así es como puedes usarlo en tu controlador:

    const soliq = require("./ruta/a/soliq");
    
    exports.createApplication = async (req, res) => {
    
      const promesaFinanciera = soliq(2, tin, año, 4);
      const promesaContable = soliq(1, tin, año, "4");
    
      const [informeFinanciero, informeContable] = await Promise.all([promesaFinanciera, promesaContable]);
    
      // Utiliza aquí los datos financieros y contables
      // ...
    
    };
    

    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 usar await para esperar el resultado de Promise.all.

Comments are closed.