我正在使用以下代码下载和解密文件。
// 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上找到。