Node.js流在使用之间不刷新.如何冲洗



我对Node.js Streams/Buffers有一个问题,它们在第一次使用后没有被关闭/刷新。我有一个从fs.createReadStream创建的读取流,我正在将其管道传输到自定义写入流。每个块的highWaterMark是~2MB(这很重要(。当我最初流式传输大约3MB的文件时,它由我的流分为两个块来处理,首先是大约2MB的块,然后是大约1MB的块。这是意料之中的事。

在我通过的第二个文件中,第一个块只有大约1MB。这是一个问题。当我将管道中的字节相加时,我可以清楚地看到,在第一个文件之后,相关的流/缓冲区没有正确清理。这可以通过以下数学来显示:

传输的第一个文件的最终块是875837字节。传输的下一个文件的第一个块是1221316字节(预期:2097152字节(。当你把875837加到1221316上时,你得到2097153,这是我前面提到的高水位线(有一个错误(。

这是我得到的代码:

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?

writeStream.end()将允许您(可选(发送最后一个块并关闭流。它意味着在触发关闭writeStream.on("finish")事件之前被调用,该事件将刷新流。

最新更新