2010-12-11 3 views
1

Ich bin nicht in der Lage, dies zu Arbeit bekommen:Kann ich eine http.ServerResponse als Prototyp in node.js verwenden?

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

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

Der Server hängt nur:

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

durch dieses Verfahren beispielsweise nicht funktioniert, wieder auf das Objekt die Standardantwortmethoden aufrufen. Kann jemand erklären, was ich falsch mache?

Antwort

4

Von MDC:

Object.create(proto [, propertiesObject ]) 

Dieses ein neues Objekt erstellen, das Prototyp ist Proto ist, das Objekt selbst nichts auf sich selbst definieren hat:

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

Ergebnis:

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

{} 

So Warum wirft es keinen Fehler und explodiert? Abgesehen von der verwirrten Eigenschaft, die nachschlagen und einstellen kann, gibt es einen Grund, warum es nicht funktioniert.

Während Ihr neues Objekt auf dasselbe Objekt verweist wie das alte, ist NICHT das alte.

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

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

Dies beendet die Anforderung, this das neue Objekt ist, aber this.connection._outgoing[0] verweist immer noch das alte Objekt, so die Anforderung nie fertig gestellt und der Server hängt.

Ich habe immer noch keine Ahnung, was Sie hier erreichen wollen, da es keinen Sinn macht, Object.create hier zu verwenden, wenn Sie besorgt sind, dass res bei anderen Anfragen überschrieben wird, ist das nicht der Fall da jedes res eine eigene Variable ist, die auf ein anderes Objekt verweist.

+0

Vielen Dank Ivo. Das macht Sinn und sollte etwas sein, das ich mit ein bisschen Jagd durch die Quelle finden konnte. Ich stellte mir vor, dass entweder (a) mit res eine Magie passierte oder (b) eine Lücke in meiner Kenntnis der prototypischen Vererbung bestand. Wie ich vermutet habe, ist letzteres der Fall. Was ich versuchte zu erreichen, war ein Proxy-Design-Muster, wo ich nur eine Funktion für das neue Objekt neu definieren, sagen writeHead, ein paar "Filter" anwenden und den alten res.writeHead am Ende aufrufen. Es sieht so aus, als ob es einen einfacheren Weg gibt, dies zu erreichen. –

Verwandte Themen