2015-06-18 4 views
2

Я хочу трубу fs.createReadStream дважды, код здесь:Почему fs.createReadStream работает только один раз?

fs.createReadStream('pdf-sample1.pdf') 
    .pipe(fs.createWriteStream('pdf-sample2.pdf')) 
    .pipe(fs.createWriteStream('pdf-sample3.pdf')) 

Но я встречаю ошибку:

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) 

, кто может сказать мне причину?

+0

Возможно, это должно помочь: http://stackoverflow.com/a/14174228/2651076 – Sinstein

ответ

2

Вы не можете передавать прочитанный поток в другой читаемый поток. Поток:

readable.pipe(writable); 

Записываемый, этот случай, может быть:

Так что, если вы пытаетесь прочитать несколько файлов и трубы их на записываемый поток, вы должны трубы каждый один на записываемый поток и и передать 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); 

Конечно, это не самый лучший способ сделать это, вы могли бы реализовать функцию, чтобы обернуть эту логику в более общем плане, может быть, с петлей или recursive solution.

Еще более простым решением было бы использовать модуль, который уже решил эту проблему, например this one here.

Смежные вопросы