我正在嘗試創建一個包含 csv 檔案的 zip 檔案,并將其作為緩沖區從函式中回傳。我的代碼如下:
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();
}
和函式呼叫:
const buffer = await createZipFromCsv("some,csv,data");
console.log(buffer)
但是,函式呼叫后的緩沖區控制臺日志未定義。onfinish 里面的控制臺日志回傳一個很好的緩沖區,但只有在函式呼叫之后的控制臺日志之后。我很困惑為什么函式在緩沖區完成寫入之前回傳。
任何幫助表示贊賞!
uj5u.com熱心網友回復:
您需要將代碼包裝在您回傳的承諾中,然后適當地解決/拒絕。這是一種方法:
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();
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482960.html
標籤:javascript 节点.js 承诺 缓冲 归档器
