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
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
Creio que eu tinha colocado na outra pergunta, deixa eu colocar ela pra cá
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);
}
};
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?
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
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/
Certo vou olhar os links, tentei limpar o cache manualmente pra ver se funcionava mas também não foi. Vou sobre as node js streams.
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 ?
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?