変身
変換ストリームは読み取りと書き込みの両方が可能なため、非常に優れた「中間」ストリームです。このため、through
ストリームと呼ばれることもあります。これらは、データを送信するだけでなく、データを操作するための優れたインターフェースを提供することを除いて、この点で二重ストリームに似ています。変換ストリームの目的は、データがストリームを介してパイプされるときにデータを操作することです。たとえば、いくつかの非同期呼び出しを実行したり、いくつかのフィールドを派生させたり、いくつかのものをリマップしたりすることができます。
変換ストリームの作成方法については、こことここを参照してください。あなたがしなければならないすべては:
- ストリームモジュールを含める
- Transformクラスをインスタンス化(または継承)
- を受け取る
_transform
メソッドを実装し(chunk, encoding, callback)
ます。
チャンクはあなたのデータです。で作業している場合は、ほとんどの場合、エンコーディングについて心配する必要はありませんobjectMode = true
。チャンクの処理が完了すると、コールバックが呼び出されます。次に、このチャンクは次のストリームにプッシュされます。
本当に簡単にストリームを実行できる素晴らしいヘルパーモジュールが必要な場合は、through2をお勧めします。
エラー処理については、読み続けてください。
パイプ
パイプチェーンでは、エラーの処理は確かに重要です。このスレッドによると、 .pipe()はエラーを転送するように構築されていません。だから...のようなもの
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
...ストリームのエラーのみをリッスンしますc
。でエラーイベントが発生した場合a
、それは渡されず、実際にはスローされます。これを正しく行うには:
var a = createStream();
a.on('error', function(e){handleError(e)})
.pipe(b)
.on('error', function(e){handleError(e)})
.pipe(c)
.on('error', function(e){handleError(e)});
さて、2番目の方法はより冗長ですが、少なくともエラーが発生した場所のコンテキストを維持できます。これは通常良いことです。
宛先でエラーをキャプチャするだけで、発生した場所をあまり気にしない場合は、event-streamが役立ちます。
終わり
エラーイベントが発生しても、終了イベントは(明示的に)発生しません。エラーイベントの発行により、ストリームが終了します。
ドメイン
私の経験では、ほとんどの場合、ドメインは本当にうまく機能しています。未処理のエラーイベントがある場合(つまり、リスナーなしでストリームでエラーが発生する場合)、サーバーがクラッシュする可能性があります。これで、上記の記事で指摘したように、すべてのエラーを適切にキャッチするドメインでストリームをラップできます。
var d = domain.create();
d.on('error', handleAllErrors);
d.run(function() {
fs.createReadStream(tarball)
.pipe(gzip.Gunzip())
.pipe(tar.Extract({ path: targetPath }))
.on('close', cb);
});
ドメインの優れた点は、スタックトレースが保持されることです。イベントストリームもこれをうまく行います。
詳しくは、ストリームハンドブックをご覧ください。かなり詳細ですが、非常に便利であり、多くの便利なモジュールへの素晴らしいリンクを提供します。
Promise
フレームワークはそれをより簡単にします