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

时间:2018-11-13 20:45:22

标签: node.js stream buffer

我在使用Node.js流/缓冲区时遇到问题,在第一次使用后它们没有被关闭/丢弃。我有一个从fs.createReadStream创建的读取流,正在将其输送到自定义写入流。每个块的highWaterMark为〜2MB(这很重要)。当我最初通过〜3MB文件流式传输时,我的流将其分为2个块​​处理,首先是〜2MB块,然后是〜1MB块。这是预期的。

在我通过的第二个文件上,第一个块只有〜1MB。这是一个问题。当我加总管道传输的字节时,可以清楚地看到在第一个文件之后,未正确清理关联的流/缓冲区。可以用以下数学公式来显示:

第一个文件的最后传输块为875,837字节。传输的 next 文件的第一块是1,221,316字节(预期:2,097,152字节)。当您将875,837加到1,221,316时,您将得到2,097,153,这是我之前提到的最高水位线(误差为1)。

这是我得到的代码:

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?

0 个答案:

没有答案