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

Atualização de buffer para fazer download de arquivo

Olá pessoal, postei uma dúvida aqui alguns dias atrás porém não tive resposta, não sei mto bem como perguntar isso pois nem eu entendi direito o que está acontecendo, estou construindo uma aplicação web que permite que seja baixado uma planilha que puxa dados de outro sistema e essas planilhas variam de acordo com a escolha do usuário e quando baixo uma planilha com dados diferentes tenho que fazer o processo duas vezes para realmente a planilha sofrer alteração. Quando tentei debugar meu código aparece que o buffer não está sendo atualizado, só na segunda solicitação que ele muda, alguem pode me ajudar por favor ?

<Buffer 50 4b 03 04 0a 00 00 00 08 00 00 00 21 00 b5 55 30 23 ec 00 00 00 4c 02 00 00 0b 00 00 00 5f 72 65 6c 73 2f 2e 72 65 6c 73 8d 92 cd 4e c3 30 0c 80 ef ... 6116 more bytes>

Estou conseguindo ver que o arquivo não é atualizado pq o tamanho dele não muda na primeira solicitação, apenas na segunda.

Estou construiundo essa aplicação em node js e js no front

Carregando publicação patrocinada...
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

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?