0

我有一个想多次阅读的 ReadStream。readStream 是使用 fs.createReadStream 创建的。

我第一次使用它来获取它的md5哈希值,我正在使用 module hasha, function fromStream,第二次我使用它FormData来将文件上传到虚拟主机。

我怎样才能使用这个 ReadStream 来做这两件事呢?

readStream = fs.createReadStream("/tmp/test.txt");
hash = await hasha.fromStream(readStream, hashOptions);
readStream.on("data", (chunk) => console.log("data chunk", chunk)).on("end", () => console.log("finished"));

它没有按应有的方式将内容记录到控制台,可能是因为hasha.fromStream它正在pipe处理流。如果我不执行hasha.fromStream它工作正常,则会记录块。

我正在使用的模块hasha位于 github 上:https ://github.com/sindresorhus/hasha/blob/master/index.js#L45

我不想在获取哈希之前将数据保存到缓冲区,因为我将在大文件中使用它。

我还制作了一个 runkit 脚本来显示我的问题,你可以在那里玩: https ://runkit.com/5942fba4653ae70012196b77/5942fba4653ae70012196b78

4

2 回答 2

4

这是一个关于如何“分叉”流的独立示例,以便您可以将其通过管道传输到两个目的地:

const PassThrough = require('stream').PassThrough;

async function hashAndPost(stream) {
  let pass1 = new PassThrough();
  let pass2 = new PassThrough();

  stream.pipe(pass1);
  stream.pipe(pass2);

  // Destination #1
  pass1.on('data', chunk =>
    console.log('data chunk', chunk.toString())
  ).on('end', () =>
    console.log('finished')
  );

  // Destination #2
  let hash = await hasha.fromStream(pass2, { algorithm : 'md5' });
  console.log('hash', hash);
};
于 2017-06-16T06:44:55.290 回答
2

您可以通过重新读取文件来重新创建流,也可以倒带流,如下所述:如何重置 nodejs 流?

于 2017-06-15T22:56:20.697 回答