Подтвердить что ты не робот

Как подключить один читаемый поток к двум записываемым потокам сразу в Node.js?

Цель состоит в следующем:

  • Создайте поток чтения файла.
  • Подключите его к gzip (zlib.createGzip())
  • Затем передайте поток чтения вывода zlib в:

    1) HTTP response object

    2) и записываемый поток файлов для сохранения gzipped-вывода.

Теперь я могу сделать до 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?

4b9b3361

Ответ 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);