Node.js流管道混乱-没有'unpipe'事件

时间:2019-06-12 19:31:57

标签: node.js stream pipe broken-pipe

我正在使用以下代码下载和解密文件。

  // Kick off an async promise to download the file
  promises.push(new Promise((resolve, reject) => {
    // Create a request for the file
    const uri = `http://127.0.0.1:8080/${file}`
    const req = request(encodeURI(uri)) 

    // Stream download the file
    const stream = req
      .on('error', (error) => {
        console.error(`Failure downloading ${file} with error ${error}`);
        // Always resolve an error. It should not stop the stream. But will be reported on the UI.
        resolve();
      })
      // Pipe it to decryption
      .pipe(decipher)
      .on('error', (error) => {
        console.error(`Error decrypting ${file} due to error ${error}`);
      })
      .on('finish', () => {
        console.timeEnd(file);
        resolve();
      });
      // .pipe(progressStream({drain: false}, (progress) => {}))
      // .pipe(passThrough.PassThrough())
      // .on('error', (error) => {
      //   console.error(`Error progressing ${file} due to error ${error}`);
      // });

    archive.append(stream, { name: file });
  }));

但是我遇到了一些我不理解的奇怪场景。

首先,如果没有错误,则以上所有操作均按预期进行。即没有请求下载或解密错误。

但是如果有错误

1)关于“错误”的要求没有触发-而是落入了关于“错误”的解密中

2)解密“错误”导致在存档器上运行“ unpipe”事件。如here

所述,这是一个已知的结果

3)如果我在'finish'之后取消注释代码并通过管道传递给progressStream或passThrough,则存档器上没有'unpipe'事件。而是应用程序挂起,并且承诺从未解决。似乎仍在发生“ unpipe”,但没有发出我能找到的事件。

虽然我有些理解2)其他观点使我感到困惑。为什么在“解密”之后管道传输到其他流会隐藏“ unpipe”事件。为什么只有“解密”报告错误。

更新:我已经创建了一个仓库来复制问题。可以在https://github.com/sregger/pipe-issue上找到。

0 个答案:

没有答案