Stream を制する者、Node.js を制する」だそうです。

私がやりたいことは、次のようなものです。一つのファイルを読み込んで、条件に応じて、いくつかのファイルに振り分ける。よくある処理ですね。

API ドキュメントを読むと、`Stream` の readable.pipe(destination[, options]) の項に次のような記述があります。

Multiple destinations can be piped to safely.(意訳: 一つのストリームに、複数のストリームをパイプで接続しても大丈夫。)

その直後のコードが例なのかな、と思って読むと、全然そんな感じではないので、自分で試してみることにしました。

標準入力から読み込んだデータを、3つの WritableStream に接続してみます。


"use strict";

const fs = require("fs");

const writer1 = fs.createWriteStream("./1.txt", { encoding: "UTF-8" }),
      writer2 = fs.createWriteStream("./2.txt", { encoding: "UTF-8" }),
      writer3 = fs.createWriteStream("./3.txt", { encoding: "UTF-8" });

process.stdin.pipe(writer1);
process.stdin.pipe(writer2);
process.stdin.pipe(writer3);

動かしてみます。適当なデータを標準入力から与えます。

$ node multi-pipes.js
abc
def
123
$ 

出力先のファイルの内容を確認します。

$ cat 1.txt
abc
def
123
$ cat 2.txt
abc
def
123
$ cat 3.txt
abc
def
123
$ 

接続した 3つの `WritableStream` に、同じデータが流れています。確かに、複数のパイプを接続しても大丈夫です。