我想要管道fs.createReadStream
两次,代码在这里:
fs.createReadStream('pdf-sample1.pdf')
.pipe(fs.createWriteStream('pdf-sample2.pdf'))
.pipe(fs.createWriteStream('pdf-sample3.pdf'))
Run Code Online (Sandbox Code Playgroud)
但我遇到了一个错误:
Error: Cannot pipe. Not readable.
at WriteStream.Writable.pipe (_stream_writable.js:162:22)
at repl:1:86
at REPLServer.defaultEval (repl.js:132:27)
at bound (domain.js:254:14)
at REPLServer.runBound [as eval] (domain.js:267:12)
at REPLServer.<anonymous> (repl.js:279:12)
at REPLServer.emit (events.js:107:17)
at REPLServer.Interface._onLine (readline.js:214:10)
at REPLServer.Interface._line (readline.js:553:8)
at REPLServer.Interface._ttyWrite (readline.js:830:14)
Run Code Online (Sandbox Code Playgroud)
谁能告诉我原因?
您不能将可读流通过管道传输到另一个可读流。流程是:
readable.pipe(writable);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,可写的可能是:
因此,如果您尝试读取多个文件并将它们通过管道传输到可写流,则必须将每个文件通过管道传输到可写流并end: false
在执行此操作时通过,因为默认情况下,可读流会在没有可写流时结束可写流要读取的数据更多。下面是一个例子:
var ws = fs.createWriteStream('output.pdf');
fs.createReadStream('pdf-sample1.pdf').pipe(ws, { end: false });
fs.createReadStream('pdf-sample2.pdf').pipe(ws, { end: false });
fs.createReadStream('pdf-sample3.pdf').pipe(ws);
Run Code Online (Sandbox Code Playgroud)
当然,这不是最好的方法,您可以实现一个函数来以更通用的方式包装此逻辑,可能使用循环或递归解决方案。
一个更简单的解决方案是使用一个已经解决了这个问题的模块,就像这里的这个。