2010-12-11 44 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); 

服務器只是掛起。有人能解釋我做錯了什麼嗎?

回答

4

MDC

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], 
.... 

{} 

所以爲什麼它不拋出錯誤並爆炸?除了混亂的財產查找和設置,有一個原因,它不起作用。

雖然您的新對象引用與舊的對象相同的對象,但其本身不是舊的。

在: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

非常感謝伊沃。這是有道理的,而且應該是我可以通過來源找到一點點狩獵的東西。我認爲(a)在資源方面存在一些魔術或者(b)在我的原型遺傳知識方面存在一些缺陷。正如我懷疑的那樣,後者就是這樣。 我試圖完成的是一個代理設計模式,我可以在這個新對象上重新定義一個函數,比如說writeHead,對它應用一些「過濾器」,然後在最後調用舊的res.writeHead。不過,看起來有一個更簡單的方法可以實現這一點。 – 2010-12-11 14:34:08

相關問題