Node.js 获取ReadStream的哈希值并输出流的数据

Node.js 获取ReadStream的哈希值并输出流的数据,node.js,node-streams,Node.js,Node Streams,我有一个ReadStream,我想读多次。readStream是使用fs.createReadStream创建的 第一次我使用它来获取它的md5散列,我使用模块hasha,函数fromStream,第二次我使用它与FormData一起将文件上传到web主机 我如何使用这个ReadStream来完成这两件事 readStream = fs.createReadStream("/tmp/test.txt"); hash = await hasha.fromStream(readStream, has

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

第一次我使用它来获取它的
md5
散列,我使用模块
hasha
,函数
fromStream
,第二次我使用它与
FormData
一起将文件上传到web主机

我如何使用这个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
中,它是
管道
-正在对流进行加密。如果我不执行hasha.fromStream它工作得很好,块就会被记录下来

我正在使用的模块,名为
haha
位于github上:

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

我还制作了一个runkit脚本来显示我的问题,你可以在那里玩:

您可以通过重新读取文件来重新创建流,也可以回放流,如下所述:

您可以通过重新读取文件来重新创建流,也可以回放流,如下所述:

以下是一个独立的示例,介绍如何“分叉”流,以便将其传输到两个目标:

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);
};

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

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);
};

也许用这样的东西?谢谢,但这不是我想要的也许用这样的东西?谢谢,但这不是我想要的。我不喜欢它如何将缓冲区保存到阵列,如果流可能是10gb呢?关于重新创建-在我对输入进行的模块中,我只获取流,我不知道文件路径,甚至不知道它是否是文件。@xerq我实际上发布了一个包,因为这个答案:。它仍然在数组中累积流部分,但您可以控制它。如果您只需要在两个方向上推送流,为什么不管道两次呢?我不喜欢它将缓冲区保存到阵列的方式,如果流可能是10gb呢?关于重新创建-在我对只接受流的输入进行的模块中,我不知道文件路径,甚至不知道它是文件。@xerq我实际上发布了一个包,因为这个答案:。它仍然在数组中累积流部分,但您可以控制它。如果你只需要向两个方向推动水流,为什么不用管道两次呢?