2013-12-20 3 views
8

私はストリームを学習しようとしており、問題が少しでもうまくいけばうまく動作します。基本ノードStream.Readableの例を実装するにはどうすればよいですか?

この例では、静的オブジェクトをストリームにプッシュし、そのストリームをサーバーレスポンスにパイプするだけです。

これまで私がこれまで持っていたことはありますが、多くは機能しません。ストリームをコンソールに出力するだけでも、それを自分のレスポンスにパイプする方法を知ることができます。

var Readable = require('stream').Readable; 

var MyStream = function(options) { 
    Readable.call(this); 
}; 

MyStream.prototype._read = function(n) { 
    this.push(chunk); 
}; 

var stream = new MyStream({objectMode: true}); 
s.push({test: true}); 

request.reply(s); 

答えて

8

現在のコードにはいくつか問題があります。

  1. リクエストストリームは、おそらくバッファモードストリームです。つまり、オブジェクトに書き込むことはできません。幸いにも、あなたは間違いが何の問題も引き起こさないように、Readableのコンストラクタにオプションを渡すことはありませんが、意味的には間違っており、期待される結果が得られません。
  2. Readableのコンストラクタを呼び出しますが、プロトタイププロパティは継承しません。 Readableをサブクラス化するには、util.inherits()を使用してください。
  3. chunk変数はコードサンプルのどこにも定義されていません。ここで

実施例である:

var util = require('util'); 
var Readable = require('stream').Readable; 

var MyStream = function(options) { 
    Readable.call(this, options); // pass through the options to the Readable constructor 
    this.counter = 1000; 
}; 

util.inherits(MyStream, Readable); // inherit the prototype methods 

MyStream.prototype._read = function(n) { 
    this.push('foobar'); 
    if (this.counter-- === 0) { // stop the stream 
    this.push(null); 
    } 
}; 

var mystream = new MyStream(); 
mystream.pipe(process.stdout); 
+0

私はストリームにコンテンツをプッシュする方法について困惑しています。私はあなたがfoobarを押しているのを見ますが、私はミストストリームのインスタンスに物を押し入れる必要があります。それ、どうやったら出来るの? – doremi

+0

コードを実行しましたか? 'this.push()'関数呼び出しは*データを読み込みキュー*にプッシュすることを意味します。これは、プッシュしたものすべてがストリームのコンシューマにとって利用可能になることを意味します(ここでは、これは 'process.stdout'ストリームです)。 –

+2

また、[ストリームハンドブック](https://github.com/substack/stream-handbook)、特に*読み込み可能なストリームを作成する*セクションも読んでください。 –

関連する問題