Executando verificação de segurança...
2

Uso de exportação de módulo em Node.js

Estou tentando usar uma variável "pricesInfoRoot" fora de um escopo de uma função após um fetch API e não consigo mesmo declarando ela fora da função, conseguem me ajudar ? No caso a variavel sempre retorna "undefined" fora do escopo da função e dentro ela retorna um array de objetos da API.

Segue código

    let body = {
      app_key: authorization.app_key,
      app_secret: authorization.app_secret,
      call: "ListarProdutos",
      param: [
        {
            "pagina": 1,
            "registros_por_pagina": 50,
            "apenas_importado_api": "N",
            "filtrar_apenas_omiepdv": "N"
        },
      ],
    };

    let pricesInfoRoot;

    async function priceConsult() {
      let request = {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(body),
      };

      try {
        let apiResponse = await fetch(`${baseURL}/geral/produtos/`, request);

        if (apiResponse.status == 200) {
          let finalResponse = await apiResponse.json();

            return priceTreat(finalResponse);

        } else {
          throw Error("Error searching products");
        }
      } catch (error) {
        console.log(error);
      }
    }

    priceConsult()




    function priceTreat(priceProducts) {

      pricesInfoRoot =  priceProducts.produto_servico_cadastro.map(price => {
        return {
          PartNumber: price.codigo,
          Preco: price.valor_unitario.toString(),
        };
    });


    /*   pricesInfoRoot.forEach(Prices => {
        Prices.Preco.toString()
      })
      console.log(pricesInfoRoot); */
3
1

Li o artigo e usei um settimeout para receber o valor fora da função e consegui, porém quando vou exportar ele exporta um array vazio, vi no aritigo que mandou ele pede pra usar live bindings que é o type = module. só que quando mudei para module ele diz que o fetch não está definido

1

Vc esta fazendo isso onde?
No node com require?

O require funciona um pouco diferente dos módulos JS!
Require é sincrino, módulos são assincronos!

Como o @DanielSchmitz disse, você tem uns problemas no seu código!

Mas da pra usar referencia com módulos JS
Ou seja, se a variavel mudar ela muda em todo lugar que ela for chamada

Veja como import funciona de uma forma bem maluca(acho que isso mais um erro que coisa boa) veja que dependendo da forma que import é usado, ele usa referencia na variavel e não algo estatico, isso pode te ajudar! Artgo abaixo

https://jakearchibald.com/2021/export-default-thing-vs-thing-as-default/?utm_source=pocket_reader

Abraços

1

Obrigado por toda paciencia que tiveram pessoal, desculpa pela minha falta de conhecimento é meu primeiro projeto em node e sou iniciante.
Se puder responder uma última pergunta seria bom, estou tentando organizar meu código com módulos como informado na nossa conversa, acha isso uma boa pratica ou teria uma melhor forma de tratar os dados e organizar o código sem ser com módulos ?

Abraços

1

Módulos(tanto CJS ou ESM) são sempre bons, melhora o código, simplifica e facilita.
Isso serve pra todas as linguagens!

Os módulos pra mim são mehores que classes(que ficam em módulos tbm rsrs) no JS/node!

O jeito de fazer sem modulos é tudo no mesmo arquivo! rsrsrsr

2

Você está fazendo algo ruim ali! o porquê de nao ter dado certo o amigo @uriel ja explicou.

Mas o buraco é mais em baixo! Você está alterando uma variável "global" (nem tão global pelo strict mode) dentro de uma função. Isso gera efeitos colaterais indesejados. Tipo, se no seu aplicativo você tem funcoes que alteram coisas globais, jaja uma variavel vai ser alterada sei la por quem e você gastará horas debugando.

Agora, pra te ajudar melhor é necessário umcontexto ali do que você quer fazer....Se esse código é um service, porque ele não pode retornar o pricesInfoRoot ao invés de setar a variável?

Nao entendi tb pq um "select" está como POST, está quebrando a regra de REST API

Segue um codigo de como deveria ser

// ./services/products.js
const body = page => {
      app_key: authorization.app_key,
      app_secret: authorization.app_secret,
      call: "ListarProdutos",
      param: [
        {
            "pagina": page,
            "registros_por_pagina": 50,
            "apenas_importado_api": "N",
            "filtrar_apenas_omiepdv": "N"
        },
      ],
    };

    export async function priceConsult(page) {
      let request = {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(body(page)),
      };

      let apiResponse = await fetch(`${baseURL}/geral/produtos/`, request);

      if (apiResponse.status == 200) {
          let finalResponse = await apiResponse.json();
          return priceTreat(finalResponse);
      }
      
      throw Error("Error searching products");
    }

    function priceTreat(priceProducts) {

      return priceProducts.produto_servico_cadastro.map(price => {
        return {
          PartNumber: price.codigo,
          Preco: price.valor_unitario.toString(),
        };
    });
1

Então Daniel, na verdade essa API que estou consumindo não aceita GET como método, eles dizem que é para segurança.
Quanto ao código como informei la embaixo eu consegui fazer ele sair do escopo da função dando um settimeout, porém n consigo exportar pra nenhum arquivo.
Basicamente eu queria as informações dessa variavel em um outro arquivo para deixar o código mais organizado, essa variavel é um array de objetos que no caso eu iria alimentar uma planilha excel.