浅析ノード.jsのStreamモジュールにおけるReadableオブジェクト
2320 ワード
私はずっとnodejsの流れを引っ張りたくないです.初めて見たので、デザインがとても気持ちが悪いです.しかし、仕方がないです.Stream仕様はまだ普及していません.そして確かにnodejsの流れに頼って実現しているものがたくさんあります.だから私も鼻をつまんで頭皮を固めて、この臭い硬いnodejs流の対象を紹介します.nodejsはstreamというモジュールを持っています.それを導入すれば、流れの対象コンストラクタのセットが得られます.今は一番簡単なstream.Readableしか言いません.実はnodejsを使ったことがありますが、ほとんどReadableと接触したことがあります.普段はあまり気にしていません.非常に典型的な例として、httpモジュールでは、各要求を処理する時にreqとresオブジェクトがあります.reqは実はReadableオブジェクトです.このreq上でHTTP要求のエンティティ部分をストリーミング形式で読むことができる.では、なぜhttpモジュールはここで流れるように設計されていますか?あるいはもう一つの次元からこの問題を聞くと「nodejsがPOST要求の内容を取得すれば?」ということです.検索エンジンを使っていることを知っている人は、データを収集してデータを収集するdataイベントをモニターし、endイベントで収集したデータを統合することができます.はい、この問題を解決する方法です.しかし、なぜこのように設計されていますか?PHPのように直接POSTの内容が取れたらいいですか?実はこのようなデザインがいいです.もし私たちが受信したデータが不正だったら、すぐに察知してから接続を切断します.このように、いくつかの不要な伝送コストを回避することができる.例えば、画像をアップロードする場合、ユーザは大きな実行可能ファイルを誤って選択したかもしれません.このファイルが完全にアップロードされるまで待つ必要はありません.ファイルのヘッダの数バイトで、一つのファイルが画像かどうか判断できます.ここでは、ストリームの設計を使用して、前の数バイトを先に読み出して使用することができる.上記のdataイベントとendイベントはいずれもReadableのイベントであり、この2つのイベントはそれぞれ受信データとデータの受信完了を表している.だから実は私達はすでにReadableの使い方を知っています.ただ多くの人はそれがReadableの対象とは知らないです.しかし、上の二つの事件はReadableの消費者にとっての事件だけです.内部はどのようにして一つのデータをReadableオブジェクトに送り、Readableにこれらのイベントをトリガさせますか?それはプッシュ方法です.次の例では、Readableオブジェクトを作成し、このオブジェクトはインクリメントされた数字を流出させます(ここではbabel-nodeを使用します).
import stream from 'stream';
var r = new stream.Readable;
r.on('data', data => {
console.log(data + '');
});
r.on('end', data => {
console.log('end');
});
r._read = () => {
// console.log('before read');
};
void function callee(i) {
if(i < 10) {
r.push(i + ''); // Buffre
} else {
r.push(null); // null , end
}
setTimeout(callee, 500, i + 1);
}(0);
上のコードをよく見ると、不思議なところがあります.このコードは書いてあります.readの方法、これは何の鬼ですか?実は私もピットだと思います.このプライベートなネーミングスタイルは突っ込みません.なぜこの方法を繰り返してこそ実現できますか?この方法を上書きしていない場合は、プッシュを呼び出した時に異常を投げます.
Error: not implemented
at Readable._read (_stream_readable.js:464:22)
at Readable.read (_stream_readable.js:341:10)
これらはReadableオブジェクトの基本的な使い方です.しかし、他にも多くの穴があります.この文章は一番簡単な紹介です.データを出力できるReadableの対象を作るにはどうすればいいですか?readなどの基本的な方法については、とにかくこれらも非科学的なデザインの一つです.