我在使用Node.js Streams/Buffers时遇到了问题,第一次使用后它们没有被关闭/刷新。我创建了一个读取流,从fs.createReadStream
中读取,并将其导入到自定义的写入流中去。每个块的highWaterMark
约为2MB(这很重要)。当我最初通过一个大约3MB的文件进行流传输时,我的流处理了两个块,首先是一个大约2MB的块,然后是一个大约1MB的块。这是预期的。
在我传递的第二个文件中,第一个块只有大约1MB。这是一个问题。当我累加传输的字节时,我可以清楚地看到,在第一个文件之后,相关的流/缓冲区没有被正确清理。以下是数学上如何证明:
第一个文件传输的最终块大小为875,837字节。传输的下一个文件的第一个块大小为1,221,316字节(预期:2,097,152字节)。当您将875,837添加到1,221,316时,您会得到2,097,153,这是我之前提到的高水位标记(带有一个错误的偏移量)。
以下是我的代码:
return new Promise(async (resolve, reject) => {
const maximalChunkedTransferSize = 2*1024*1024; // 2MB (Minimum amount, Autodesk recommends 5MB).
const pathToFile = await bucketManagement.locationOfBucketZip(bucketEntity.name);
let readFileStream = fs.createReadStream(pathToFile, { highWaterMark: maximalChunkedTransferSize });
let writeStream = new HttpAutodeskPutBucketObjectWriteStream(accessToken, bucketEntity);
readFileStream.pipe(writeStream);
writeStream.on("finish", () => {
resolve(writeStream.urn);
});
writeStream.on("error", err => reject("Putting the file into the bucket failed. " + err.message));
});
我已尝试在读写流上调用.destroy()
。我已尝试调用.end()
,.unpipe()
等方法。但这些都没有起作用。我该如何销毁/刷新流和/或底层缓冲区,以使下一个文件的第一块为预期的2MB?