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

Qual framework de back esta usando?
Node puro?
E no front?

O dado chega via endpoint da API com POST?

Falta muitos dados pra podermos ajudar

Carregando publicação patrocinada...
1
1

Então uriel, estou usando node puro e js puro, apenas o express para API no back e a biblioteca Xlsx-populate para tratar os dados e jogar em uma planilha, o dado chega via POST do usuario o back processa, cria uma planilha e manda para o front, vou deixar abaixo um trecho do código que faz isso.

O código abaixo faz todo o tratamento com a planilha antes de enviar

let run = (structure) => {
async function getTreatDatasFromAPI() {
let structureToExcel = await structure;
await excelPopulate(structureToExcel);
return structureToExcel;
}

let excelPopulate = async (arrayStructureforExcel) => {
return XlsxPopulate.fromBlankAsync().then((workbook) => {
// adiciona uma nova aba na planilha
// let new_sheet = sheet.addSheet("Nova Sheet");

  // Nomeia uma aba da planilha como Planilha1

  const sheet = workbook.sheet(0);
  sheet.name("planilha");
  sheet.row(1).cell(1).value("Part Numbers");
  sheet.row(1).cell(2).value("Quantidade");
  sheet.row(1).cell(3).value("Preços com Fator 3");
  // Arrays que recebem posições das celulas no excel
  let cellColumnA = [];
  let cellColumnB = [];
  let cellColumnC = [];

  for (let i = 2; i <= arrayStructureforExcel.length + 1; i++) {
    cellColumnA.push(`A${i}`);
    cellColumnB.push(`B${i}`);
    cellColumnC.push(`C${i}`);
  }
  sum = 0;
  for (let i = 0; i < cellColumnA.length; i++) {
    sheet.cell(cellColumnA[i]).value(arrayStructureforExcel[i].PartNumber);
    sheet.cell(cellColumnB[i]).value(arrayStructureforExcel[i].Qtd);
    sheet.cell(cellColumnC[i]).value(arrayStructureforExcel[i].Preco);
    sheet
      .row(cellColumnC.length + 2)
      .cell(3)
      .value("Total: " + (sum += arrayStructureforExcel[i].Preco));
  }
  return workbook.toFileAsync("StructureAndPrizes.xlsx");
});

};
getTreatDatasFromAPI();
};
Código abaixo envia o arquivo que preciso atualizar antes de mandar para o usuario

const getAll = async (req, res, next) => {
try {
const workbook = await XlsxPopulate.fromFileAsync(
"StructureAndPrizes.xlsx"
);
// console.log(workbook);

Realiza edições no workbook, se necessário.

const data = await workbook.outputAsync();

Define o nome do arquivo de saída.
await res.attachment("pivot.xlsx");

Envia o workbook como resposta.
await res.send(data);

} catch (error) {
next(error);
}
};

1

Então vc manda atulizar no FRONT e não atualiza no back.
Ai vc precisa mandar atualizar de novo, finalmente atualizando no back?

Ou é no front?

É isso?

1

Na verdade pelo front só é feito a requisição, e no back end que eu faço todo o tratamento da planilha para mandar novamente
Desculpa a demora para responder

1

Vc precisa mudar para usar stream.

Stream não deixar o buffer encher e manda tudo pro front ou outro lugar.

Vc fazendo isso esta enchendo a memoria. O buffer cheio da problema!

Para ajudar
https://www.freecodecamp.org/portuguese/news/streams-em-node-js-tudo-o-que-voce-precisa-saber/

https://www.youtube.com/watch?v=pB5-QzabL2I&ab_channel=ErickWendel

https://www.youtube.com/watch?v=r-33Hhbvr1M&ab_channel=ErickWendel

https://nodesource.com/blog/understanding-streams-in-nodejs/

1
1

Fala Uriel, cara, na verdade eu descobri qual é o problema porém não consigo resolver, essa aplicação cria uma planilha excel no back end com as infos do usuario, porém quando o usuario clica no botão baixar planilha ele é redirecionado para uma rota de download que tem algumas funções no back end que puxam outras, e o back end está sem uma lógica asíncrona que espera a informação do usuario carregar para fazer a planilha. O que acontece é que quando o usuario clica em download primeiro é baixado planilha depois a informação que o usuario pediu fica armazenado nela e então no segundo click ele manda o que o usuario pediu na primeira solicitação. Usar async await nesse caso é o mais indicado certo ?

1

Olha, não ta dando pra entender direito isso!

Não consigo entender bem sua explicação!
async await é só pra não bloquear o loop de eventos do Node ou do navegador!
Assim não travando o Node ou o Navegador entende.

É pra isso que usamos async await.

Vc dise que descobriu o problema, vc pode espcificar melhor?