【ノード.js】Streamの学習ノート

6355 ワード

最近勉強しています.jsはhttp proxy serverを作成し、Streamと付き合う必要があります.昨日からいくつかの資料を調べ始めたが,多少の粗浅な理解があった.ここに整理して、勉強のために使います.
ノードからjs APIドキュメントでは、
  "A stream is an abstract interface implemented by various objects in Node. For example a request to an HTTP server is a stream, as is  stdout . Streams are readable, writable, or both. All streams are instances of EventEmitter."「ストリームは多くのI/0操作の抽象であり、ノード内の多くのオブジェクトによって実現される.例えば、1つのHTTPサーバに対する要求はストリーム(読み取り可能なストリーム)(サーバの応答はストリーム(書き込み可能なストリーム))、stdoutもストリームである.ストリームは読み取り可能、書き込み可能、または両方を兼ね備えている.ストリームはEventEmitterのインスタンスである」
 
一.ストリーム(Stream)が必要なのはなぜですか?
たとえば、ファイルを読み込む場合は、一度に読み込むのに大きなメモリが必要になるため、望ましくありません.そのため、ストリームがあり、ストリームを使用するのが便利で、このような問題を回避することができます.インタフェースを呼び出すには、下位層がどのように実現されるかに関心を持つ必要はありません.
 
二.ストリーム(Stream)とは?
ストリーム(Stream)は読み取り可能、書き込み可能、またはデュプレクスです.ストリームのベースクラスは、Readableストリーム、Writableストリーム、Duplexストリーム、Transformストリームの4種類のベースクラスを含むrequire('stream')によってロードできます.
  
また,上記4種類のベースクラスストリームが需要を満たすことができないと感じたら,独自の拡張クラスストリームを記述することができる.私たちのチームが今やっているノードプロジェクトのように、Transformクラスを書き換えて使用しています.
公式のAPIドキュメントに従って、次の手順に従います.
  • 適切な親を子クラスに拡張します.(例えばutil.inherits(MyTransform,Transform); )
  • 構造関数で親クラスの構造関数を呼び出し、内部のメカニズムが正しく初期化されていることを確認します.
  • は、以下の詳細を参照して、1つまたは複数の特定の方法を実装する. 

  •       【Node.js】Stream(流)的学习笔记
     
     
    三.Readableストリーム(読み取り可能なストリーム)の説明
    Readable(読み取り可能)ストリームインタフェースは、読み込んでいるデータのソースの抽象です.すなわち、データは読み取り可能なストリームから出ている.
    Readableストリームには、フローモードと一時停止モードの2つのモードがあります.
    フローモードにある場合、データは最下位システムから読み出され、できるだけ早くプログラムに提供されます.一時停止モードの場合は、stream.read()を明確に呼び出して、いくつかのデータブロックを取り出す必要があります.ストリームはデフォルトで一時停止モードです.
       
    A.次の3つの方法により、可読ストリームがフローモードに切り替わる
         1.データを傍受する'data'イベントプロセッサを追加します.
         2.resume()メソッドを呼び出して、データストリームを明確に開きます.
           3. pipe()メソッドを呼び出して、書き込み可能なストリーム(Writable)にデータを送信します.
    これまでpipe()の使い方に疑問を持っていましたが、使い方が分かりません.次に、pipe()を使用して読み取り可能なストリームに受信者(書き込み可能なストリーム)を指定すると、データは本当に下位システムから読み出され、書き込み可能なストリームに渡されることが分かった.
      
    B.Readableストリームには以下のようなイベントがあります.
         1. 'Readableイベント
         2. 'Data'イベント-データが渡されている間にイベントがトリガーされます(chunkデータブロックをオブジェクトとします)
         3. 'end'イベント-データ転送が完了すると、イベントがトリガーされます.
         4. 'closeイベント
         5. 'errorイベント
    これらのイベントはすべて、公式APIドキュメントで例を見つけることができます.
     
    C.次にReadableストリームの重要な方法,pipe()方法を紹介する.
    この方法は、読み取り可能なストリームからすべてのデータを引き出し、提供されたターゲット(書き込み可能なストリーム)に書き込む.この方法は、ターゲットが高速読み取り可能な読み取り可能なストリームに埋もれないように、トラフィックを自動的に制御することができる.
    デフォルトでは、データ転送が完了し、「end」イベントがトリガーされると、ターゲット(書き込み可能なストリーム)の「end」イベントが同時にトリガーされ、ターゲットが書き込み不可能になることに注意してください.
    簡単な例を挙げると
     1 //http.js
    
     2 
    
     3 var http = require('http');
    
     4 var fs = require('fs');
    
     5 
    
     6 http.createServer(function(req, res){
    
     7     var stream = fs.createReadStream(__dirname + '/data.txt');
    
     8     stream.pipe(res);
    
     9 }).listen(3000);
    
    10 
    
    11 console.log('now we are listening 3000 port');

         data.txtファイルの内容は以下の通りです.
         【Node.js】Stream(流)的学习笔记
    このコードが実行されると、ユーザはhttp://127.0.0.1:3000/にアクセスし、次のような応答を得る.
         
    このとき、このサーバを作成すると、streamが呼び出されると、ユーザアクセス要求が来る.pipe(res)読み取り可能ストリームにターゲットを指定すると、読み取り可能ストリームstreamはファイルdataから開始する.txtでデータを読み出し、res(書き込み可能なストリーム)にデータを書き込むと、resのend()メソッドが自動的に呼び出され、応答が終了し、書き込み可能なストリームは書き込まれなくなります.
     
    四.Writableストリーム(書き込み可能ストリーム)の紹介
    Writable(書き込み可能)ストリームインタフェースは、データを書き込むターゲットの抽象である.
    書き込み可能なストリームの重要な2つの方法
       1. write()メソッド
    この方法は、下位システムにデータを書き込み、データが処理された後に、与えられたコールバックを呼び出す.
       2. end()メソッド
    データが書き込まれなくなった場合、このメソッドを呼び出し、書き込みを停止します.end()を呼び出した後、write()メソッドを呼び出すとエラーが発生します.
     
    五.参考資料
       1. Node.js公式APIドキュメント
        http://www.nodejs.org/api/stream.html
       2. 公式APIドキュメント中国語版
        http://nodeapi.ucdok.com/#/api/stream.html
       3.ノード内のストリーム(Stream)
          http://blog.segmentfault.com/xingrz/1190000000357044
       4. Node Streams: How do they work?
        http://maxogden.com/node-streams.html
     
     
    れんがを投げて玉を引いて、給油を続けます.
     
      Best Regards
      Kevin Song 
                                                                                     - 2014/6/18