2011-08-06 4 views
2

ファイルから、時にはソケットを介して、時にはバッファや文字列を生成する同じプログラムの別の部分から入力を読み込むアプリケーションがあります。データソースとしてnodejs Stream APIを正しく実装するにはどうしたらいいですか?

両方のソケットとファイルは、ノードのストリームAPIで扱うことができる、と私は、バッファや文字列のことを模倣するためのラッパーのいくつかの種類を思い付くしようとしてきました。私は文字列を入力として処理するために '消費者'コードの2つのバージョンを書く必要はなく、データがすでにメモリに入っているときにディスクに書き込んで再度読み返したくない場合があります。

ほとんどの物事はうまく動作するように見えるが、何かが「パイプ」の私の実装を破壊されています

MemoryStream.prototype = new process.EventEmitter; 

MemoryStream.prototype.pipe = function(dest,opts){ 
    var that=this; 
    function pipe_mem(data){ 
     if(!dest.write(data)){ 
      that.pause(); 
      dest.once('drain',function(){ 
       if(pipe_mem(data)){that.resume();} 
      }); 
      return false; 
     } 
     return true; 
    } 
    this.on('data',pipe_mem); 
    if(!opts || opts.end){this.on('end',dest.end);} 
    this.resume(); 
}; 

MemoryStream.prototype.resume = function(){ 
    var i,l,encoder; 
    if(this.active) return; 
    this.active = true; 
    l = this.buffer.length-1; 
    if(l>=0){ 
     encoder = this.encoding?emit_string:emit_buffer; 
     for(i=0;i<l;i++){encoder(this,this.buffer[i],this.encoding);} 
     if(this.buffer[i]===''){ 
      this.emit('end'); 
      this.destroy(); 
     }else{encoder(this,this.buffer[i],encoding);} 
     this.buffer = []; 
    } 
}; 

私は「パイプ」と呼ぶたびに、私はこの奇妙なエラーが発生します。

TypeError: Object #<EventEmitter> has no method '_implicitHeader' 
    at EventEmitter.<anonymous> (http.js:651:10) 
    at EventEmitter.emit (events.js:61:17) 
    at EventEmitter.resume (/MemoryStream.js:36:9) 

/MemoryStream.js 36行目はthis.emit('end');

何が起こっているのでしょうか?これを修正するにはどうすればよいですか、または私が欲しいことをするためのよりよい方法がありますか?

答えて

4

答えは:あなたが見

var end = response.end; response.end = function() { response.end = end; response.end() } 

var end = response.end; response.end = function() { end() } 

の代わりにこのような何か:どこかであなたは、このような何かを呼び出しますか? 文脈は異なります:最初のケースでは 'this === global'と呼びますが、global._implicitHeader関数はなく、2番目のケースでは 'this === response'と呼びます。 response._implicitHeader関数です。

+0

Woa。 JavaScriptには深刻な魔法があります。 – Almo

関連する問題