My Node js API mixes data from different requests

Asked

Viewed 92 times

0

I developed a private app on Zapier.com. The framework is in Node js. And it is composed of triggers and actions.

In one of my actions, when it is desplotted several triggers simultaneously I get mixed data.

I would like to understand how to prevent this situation.

/***

Zapier Action
@autor Pedro Correia, from Portugal
@company NovosCanais
@date 27-11-2019

***/
// O zapier sempre que encontra uma ',' coloca a string em formato de array e faz split
function validacoes(){
  if (bundle.inputData.nome) {
    if (Array.isArray(bundle.inputData.nome) && bundle.inputData.nome.length){
      bundle.inputData.nome.join(', ');
    }
  }
  if (bundle.inputData.email) {
    if (Array.isArray(bundle.inputData.email) && bundle.inputData.email.length){
      bundle.inputData.email.join(', ');
      z.console.log(bundle.inputData.email);
    }
  }
  if (bundle.inputData.morada) {
    if (Array.isArray(bundle.inputData.morada) && bundle.inputData.morada.length){
      bundle.inputData.morada.join(' and ');
      z.console.log(bundle.inputData.morada);
    }
  }
  if (bundle.inputData.codpost) {
    if (Array.isArray(bundle.inputData.codpost) && bundle.inputData.codpost.length){
      bundle.inputData.codpost.join(', ');
    }
  }
  if (bundle.inputData.local) {
    if (Array.isArray(bundle.inputData.local) && bundle.inputData.local.length){
      bundle.inputData.local.join(', ');
    }
  }

}
validacoes();
// 1º fazemos um search sobre os clientes
// uma vez que garantidamente temos um número de contribuinte que é identificador do cliente
let options = {
  url: 'https://api.drivefx.net/v3/searchEntities',
  method: 'POST',
  headers: {
    'Authorization': process.env.API_KEY
  },
  body: {

        "queryObject": {
        "distinct": false,
        "entityName": "cl",
        "filterCod": "",
        "filterItems": [{
        "filterItem": "ncont",
        "comparison": 0,
        "valueItem": bundle.inputData.ncont,
        "groupItem": 0
        }],
        "SelectItems": ["*"]
        }

  }
}

// globals

let log;

// Procura cliente, caso não exista cria um com os dados que recebeu
return z.request(options)
  .then((response) => {
    response.throwForStatus();
    // *** log
    let clientes = z.JSON.parse(response.content);
    let no;
    if (Array.isArray(clientes.entities) && clientes.entities.length){
        // Entrei aqui: então não preciso criar cliente
        //*** Atualizamos o cliente antigo?????????????
        no = clientes.entities[0].no;

        // update cl
        clientes.entities[0].email = (bundle.inputData.email) ? bundle.inputData.email : "";
        clientes.entities[0].morada = (bundle.inputData.morada) ? bundle.inputData.morada : "";
        clientes.entities[0].codpost = (bundle.inputData.codpost) ? bundle.inputData.codpost : "";
        clientes.entities[0].local = (bundle.inputData.local) ? bundle.inputData.local : "";

        return criarClienteAndFatura(true, clientes.entities[0], no);

    } else {
        // Entrei aqui: então vou criar o cliente no driveFX
        // 1º buscamos uma instancia default do cliente

        return criarClienteAndFatura(false, null);      
    }

  });


function criarClienteAndFatura(updateCl, cliente_searched, no) {


    if (updateCl && cliente_searched) {



        let options = {
          url: 'https://api.drivefx.net/v3/saveInstance',
          method: 'POST',
          headers: {
            'Authorization': process.env.API_KEY
          },
          body: {
            "entity" : "Cl",
            "ndoc" : 1,
            "itemVO" : cliente_searched
          }
        }

        return z.request(options)
          .then((response) => {
            response.throwForStatus();
            // *** log
            log = response.content;
            z.console.log(response.content);
            let results = z.JSON.parse(response.content);

            // callback
            return criarFatura(no);
          });
    }
    else {
        let options = {
            url: 'https://api.drivefx.net/v3/getNew',
              method: 'POST',
              headers: {
                'Authorization': process.env.API_KEY
              },
              body: {
                "entity" : "Cl",
                "ndoc" : 1
              }
            }

            return z.request(options)
              .then((response) => {
                response.throwForStatus();
                // *** log
                    z.console.log(response.content);
                // parse instance
                let novoCliente = z.JSON.parse(response.content);
                no = novoCliente.no;
                // set instance
                novoCliente.nome = (bundle.inputData.nome) ? bundle.inputData.nome : "";
                novoCliente.email = (bundle.inputData.email) ? bundle.inputData.email : "";
                novoCliente.morada = (bundle.inputData.morada) ? bundle.inputData.morada : "";
                novoCliente.codpost = (bundle.inputData.codpost) ? bundle.inputData.codpost : "";
                novoCliente.local = (bundle.inputData.local) ? bundle.inputData.local : "";
                novoCliente.ncont = (bundle.inputData.ncont) ? bundle.inputData.ncont : "";
                z.console.log(novoCliente.nome + " nome");
                // save instance
                let options = {
                  url: 'https://api.drivefx.net/v3/saveInstance',
                  method: 'POST',
                  headers: {
                    'Authorization': process.env.API_KEY
                  },
                  body: {
                    "entity" : "Cl",
                    "ndoc" : 1,
                    "itemVO" : novoCliente
                  }
                }

                return z.request(options)
                  .then((response) => {
                    response.throwForStatus();
                    // *** log
                    z.console.log(response.content);
                    let results = z.JSON.parse(response.content);

                    // callback
                    return criarFatura(no);
                  });

              });
    }
}


            z.console.log('after create FT2');

function criarFatura(no){
    /***
        Cliente existe ou foi criado
        Agora vamos faturar
    ***/

    options = {
        url: 'https://api.drivefx.net/v3/getNew',
        method: 'POST',
        headers: {
            'Authorization': process.env.API_KEY
        },
        body: {
            "entity" : "Ft",
            "ndoc" : 1 // número da série de documentação ***poderemos ter de alterar
        }
    }



    return z.request(options)
        .then((response) => {
        response.throwForStatus();
        z.console.log("Entrei fatura");
        let fatura = z.JSON.parse(response.content);
        let ref;
        let codigo_da_obra;

        if (no) {

            z.console.log(no);
            fatura.no=no;
            fatura.u6530_inscricao.inscricaoid = (bundle.inputData.ninscricao) ? bundle.inputData.ninscricao : "";
            fatura.u6530_inscricao.id_egoi = (bundle.inputData.id) ? bundle.inputData.id : "";
            fatura.u6530_inscricao.email_e = (bundle.inputData.email_e) ? bundle.inputData.email_e : "";
            fatura.u6530_inscricao.vem_do_egoi = true;
            fatura.u6530_inscricao.atualizou_egoi = false;
            fatura.u6530_inscricao.nome_formando = (bundle.inputData.nome_formando) ? bundle.inputData.nome_formando : "";
            // trabalhar o codInterno
          z.console.log(fatura.u6530_inscricao.inscricaoid);
            let split = bundle.inputData.codInterno.split('_');
            codigo_da_obra = split[0];
            ref = split[1];
            z.console.log(ref);
            fatura.fis.push({ref: ref, qtt: (bundle.inputData.qtt) ? bundle.inputData.qtt : "", epv: (bundle.inputData.epv) ? bundle.inputData.epv : 0, u6530_faturas_obras_adp: {codigo_da_obra: codigo_da_obra}});

        }

        // save instance
        let options = {
            url: 'https://api.drivefx.net/v3/saveInstance',
            method: 'POST',
            headers: {
                'Authorization': process.env.API_KEY
            },
            body: {
                "entity" : "Ft",
                "ndoc" : 1,
                "itemVO" : fatura
            }
        }

        return z.request(options)
            .then((response) => {
            response.throwForStatus();
            z.console.log(response.content);
            const results = z.JSON.parse(response.content);

            return results; 
        });
    });  

}

If I declare variables like var it will not mix the data?

  • It seems to me the case to check the promises of your code. Maybe this answer can help you understand the problem.

  • I would like to see if for different requests, the variables of the window object overwrite.

  • you have to listen to this, with note: obj.() or the latest proxy: var p = new Proxy(target, Handler);

  • And this way you organize your events so they don’t run into each other.

2 answers

0

One way to solve it is to make a callback of events in queue, each time an event is solved, you call the next, then at the end presents the data, example:

init = (callback, resolveFinal) => {
 const data = [];
   callback()

 if(typeof resolveFinal !== 'undefined' && resolveFinal) {
      if(data.length == 3) {
         return data;    
      }


 }

}
const data = {
 result
init((results) => {
    Servico1.metodo().then((data) => {
      results.push(data)
      init((results) => {
          Servico2.metodo().then((data) => {
                results.push(data)
                  init((results, resolve) => {
                       Servico3.metodo().then((data) => {
                           results.push(data)
                           resolve(results);
                       })
                  })
          })
       })
    })
});

0

In the post you made is wearing a drivefx API.

Have you ever used by chance this where the endpoints are https://developer.drivefx.net/app/webapp/Metodos/?

If yes you were able to login with endpoint https://sis10.drivefx.net/XXXXXX/rest/UserLoginWS/userLogin?

Regarding your post I recommended that instead of the callbacks you use Promises and better still use async/await which makes the code more readable and it would be easier to understand if at some point you’re not forcing yourself to wait for the answer.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.