Estoy generando un archivo de descarga y cada vez que envío una solicitud, me devuelve algo diferente, cada vez que el archivo se genera como se esperaba:
usuário,primeiro_nome,ultimo_nome,ativo,completou_o_treinamento 4,Foo,Bas,SIM,SIM 5,Ble,Loco,NÃO,NÃO 9,gui2,md,NÃO,NÃO 3137,foo,baz,NÃO,NÃO Pero Express Returns no es lo mismo, debería devolver el archivo en response.download . Descarga pero a veces, cuando realicé la llamada, devuelve File not found otras veces devuelve solo los campos usuário,primeiro_nome,ultimo_nome,ativo,completou_o_treinamento , no body response y, a veces devuelve el archivo como debería ser, no sé qué está mal porque el archivo siempre se genera de la manera correcta
export const createReportFile = ({ reportLines, fromDate, toDate }: CreateReportProps): string => { const startDate = format(fromDate, 'dd-MM-yyyy') const endDate = format(toDate, 'dd-MM-yyyy') const aksReportDate = Date.now() const reportFileId = `${startDate}-to-${endDate}Report${aksReportDate}` const reportFileStream = fs.createWriteStream( path.join(__dirname, '..', '..', '..', 'tmp', 'uploads', `${reportFileId}.csv`), ) const fieldsLine = 'usuário,primeiro_nome,ultimo_nome,ativo,completou_o_treinamento' reportFileStream.once('open', () => { reportFileStream.write(fieldsLine + '\r\n') reportLines.forEach(({ user_id, first_name, last_name, active, completed }) => { reportFileStream.write(`${user_id},${first_name},${last_name},${active},${completed}\r\n`) }) }) return reportFileId } . . . const usersReport = ....generate users report const reportFileId = createReportFile({ fromDate, toDate, reportLines: usersReport }) const filePath = path.join(__dirname, '..', '..', '..', 'tmp', 'uploads', `${reportFileId}.csv`) console.log(filePath) return response.download(filePath) } [ { user_id: 4, first_name: 'foo', last_name: 'baz', active: 'SIM', completed: 'SIM' }, { user_id: 5, first_name: 'Ble', last_name: 'L', active: 'NÃO', completed: 'NÃO' }, { user_id: 9, first_name: 'foooo', last_name: 'ma', active: 'NÃO', completed: 'NÃO' }, { user_id: 3, first_name: 'foo', last_name: 'bar', active: 'NÃO', completed: 'NÃO' } ] Cambié el generate file code al siguiente código
export const createReportFile = ({ reportLines, fromDate, toDate }: CreateReportProps): string => { const startDate = format(fromDate, 'dd-MM-yyyy') const endDate = format(toDate, 'dd-MM-yyyy') const aksReportDate = Date.now() const reportFileId = `${startDate}-to-${endDate}Report${aksReportDate}` let data = 'usuário,primeiro_nome,ultimo_nome,ativo,completou_o_treinamento\r\n' reportLines.forEach(({ user_id, first_name, last_name, active, completed }) => { data += `${user_id},${first_name},${last_name},${active},${completed}\r\n` }) fs.writeFileSync( path.join(__dirname, '..', '..', '..', 'tmp', 'uploads', `${reportFileId}.csv`), data, ) return reportFileId }No soy un experto para saber por qué funciona cuando cambio, pero creo que es porque en la solución anterior estaba trabajando con flujos, y ahora escribimos archivos de forma sincrónica.
Si me equivoco por favor corrígeme, me gustaría saber más sobre esto