2010-12-11 14 views
1

私はこの作業を取得することができません:http.ServerResponseをnode.jsのプロトタイプとして使用できますか?

var proxyResponse = function(res) { 
    return Object.create(res); 
}; 

このメソッドによって返されるオブジェクト上の標準的な応答メソッドを呼び出すと、例えば、動作しません:

http.createServer(function(req, res) { 
    res = proxyResponse(res); 
    res.writeHead(200, {"Content-Type": "text/html"}); 

    res.end("Hallelujah! (Praise the Lord)"); 
}).listen(8080); 

サーバがちょうどハングします。誰かが私が間違っていることを説明することはできますか? MDCから

答えて

4

Object.create(proto [, propertiesObject ]) 

は、このプロトタイプは、プロトでの新しいオブジェクトを作成し、それ自身は何も持っていないオブジェクトは、それ自体に定義する:

res.foo = function() { 
    console.log(this); 
} 
res.foo(); 
res = proxyResponse(res); 
res.foo(); 

結果:だから

{ socket: 
    { fd: 7, 
    type: 'tcp4', 
    allowHalfOpen: true, 
    _readWatcher: 
     { socket: [Circular], 
.... 

{} 

なぜそれはエラーを投げて爆発しないのですか?混乱したプロパティの参照と設定のほかに、動作しない理由が1つあります。

新しいオブジェクトは古いものと同じオブジェクトをすべて参照していますが、それ自体はであり、古いものはではありません。で

https://github.com/ry/node/blob/a0159b4b295f69e5653ef96d88de579746dcfdc8/lib/http.js#L589

if (this.output.length === 0 && this.connection._outgoing[0] === this) { 

これはthisは新しいオブジェクトで、要求を終了しますが、this.connection._outgoing[0]はまだ古いオブジェクトを参照し、その要求が完成し、サーバーがハングことはありません。

ここでもObject.createを使用するのは意味がないので、ここでは何を達成しようとしているのかまだ分かりません。別のリクエストの場合にresが上書きされることを心配している場合は、そうではありません各resは異なるオブジェクトを参照する独自の変数であるためです。

+0

ありがとうたくさんのIvo。これは理にかなっており、ソースを少し掘り下げて見つけることができるはずだったはずです。私は、(a)resで起こっている魔法があったか、(b)プロトタイプの相続に関する私の知識の中にlacunaがあったかのいずれかを考え出した。私が疑うように、後者がそうです。 私が達成しようとしていたのは、プロキシデザインパターンでした。ここでは、新しいオブジェクトの関数を1つだけ再定義することができます。たとえば、writeHeadには「フィルタ」を適用し、最後にはres.writeHeadを呼び出します。しかし、これを達成するより簡単な方法があるように見えます。 –