Estoy intentando crear un archivo zip que contiene un archivo csv y devolverlo desde una función como búfer. El código que tengo es el siguiente:
const archiver = require('archiver'); const streamBuffers = require("stream-buffers"); createZipFromCsv(csv) { var myWritableStreamBuffer = new streamBuffers.WritableStreamBuffer({ initialSize: (100 * 1024), // start at 100 kilobytes. incrementAmount: (10 * 1024) // grow by 10 kilobytes each time buffer overflows. }); myWritableStreamBuffer.on('finish', () => { console.log(myWritableStreamBuffer.getContents()) return Promise.resolve(myWritableStreamBuffer.getContents()); }); const archive = archiver('zip'); archive.pipe(myWritableStreamBuffer); archive.append(csv, { name: 'csvName.csv' }); archive.finalize(); }Y la llamada a la función:
const buffer = await createZipFromCsv("some,csv,data"); console.log(buffer)sin embargo, el registro de la consola del búfer después de la llamada a la función no está definido. El registro de la consola dentro de on finish devuelve un buen búfer, pero solo después del registro de la consola después de la llamada a la función. Estoy confundido por qué la función regresa antes de que el búfer haya terminado de escribir.
¡Cualquier ayuda apreciada!
Debe envolver su código en una promesa de devolución y luego resolver/rechazar adecuadamente. Aquí hay una forma de hacerlo:
const archiver = require('archiver'); const streamBuffers = require("stream-buffers"); createZipFromCsv(csv) { return new Promise((resolve, reject) => { const myWritableStreamBuffer = new streamBuffers.WritableStreamBuffer({ initialSize: (100 * 1024), // start at 100 kilobytes. incrementAmount: (10 * 1024) // grow by 10 kilobytes each time buffer overflows. }); myWritableStreamBuffer.on('finish', () => { resolve(myWritableStreamBuffer.getContents()); }); myWritableStreamBuffer.on('error', reject); const archive = archiver('zip'); archive.pipe(myWritableStreamBuffer); archive.append(csv, { name: 'csvName.csv' }); archive.finalize(); }); }