Как подключить один читаемый поток к двум записываемым потокам сразу в Node.js?
Цель состоит в следующем:
Теперь я могу сделать до 3.1:
var gzip = zlib.createGzip(),
sourceFileStream = fs.createReadStream(sourceFilePath),
targetFileStream = fs.createWriteStream(targetFilePath);
response.setHeader('Content-Encoding', 'gzip');
sourceFileStream.pipe(gzip).pipe(response);
..., который отлично работает, но мне также нужно сохранить gzipped-данные в файл, чтобы мне не нужно каждый раз переписывать и иметь возможность напрямую передавать gzipped-данные в виде ответ.
Итак, как я могу передать один читаемый поток в два записываемых потока сразу в Node?
Будет ли sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream);
работать в Node 0.8.x?
Ответы
Ответ 1
Я обнаружил, что zlib возвращает читаемый поток, который позже может быть передан в несколько других потоков. Поэтому я решил сделать следующее:
var sourceFileStream = fs.createReadStream(sourceFile);
// Even though we could chain like
// sourceFileStream.pipe(zlib.createGzip()).pipe(response);
// we need a stream with a gzipped data to pipe to two
// other streams.
var gzip = sourceFileStream.pipe(zlib.createGzip());
// This will pipe the gzipped data to response object
// and automatically close the response object.
gzip.pipe(response);
// Then I can pipe the gzipped data to a file.
gzip.pipe(fs.createWriteStream(targetFilePath));
Ответ 2
Цепочка/расщепление труб не работает, как вы пытаетесь сделать здесь, отправляя первые два следующих последующих шага:
sourceFileStream.pipe(gzip).pipe(response);
Однако вы можете подключить один и тот же читаемый поток к двум записываемым потокам, например:
var fs = require('fs');
var source = fs.createReadStream('source.txt');
var dest1 = fs.createWriteStream('dest1.txt');
var dest2 = fs.createWriteStream('dest2.txt');
source.pipe(dest1);
source.pipe(dest2);