2017-06-21 2 views
0

Warum beide & socket ‚Timeout‘ Handler res ausgelöst während ich nenne nurWarum beide res & Socket 'Timeout' Handler ausgelöst werden, während ich nur socket.emit aufrufen ('Timeout')?

socket.emit('timeout'); 

Nicht sicher, ob das etwas für Sie liegt auf der Hand. Vielen Dank.

[Ausgabe]

[Function] 
[Function] 
true 
timeout 
timeout2 

[Code]

var http = require('http'); 

function http_relay(req, res){ 
    //console.log(res); 
    console.log(req.socket === res.socket); 
    //console.log(res. 
    console.log(res.socket._events.timeout) 
    console.log(res.connection._events.timeout) 
    console.log(res.socket._events.timeout === res.connection._events.timeout) 

    res.on('timeout',function(){ 
     //res.end(); 
     console.log('timeout'); 
    }); 

socket = res.socket; 
    socket.on('timeout',function(){ 
     //res.end(); 
     console.log('timeout2'); 
    }); 

socket.emit('timeout'); 
//res.emit('timeout'); 
} 


    ser = http.createServer(http_relay); 

    ser.listen(8080); 

Antwort

0

Wann ist es eine eingehende HTTP-Verbindung, die http.ServerResponse Klasse Haken ein Zuhörer für den Socket Timeout-Ereignis unter Verwendung dieser:

socket.on('timeout', ...) 

und wenn es das Ereignis bekommt, dann tut es das:

res.emit('timeout', ...) 

Die allgemeine Idee ist, dass der Entwickler normalerweise nicht direkt mit den socket Schnittstelle würde selbst, sondern nur mit dem response Objekt interagieren.

Wenn Sie also das Timeout-Ereignis für den Socket manuell auslösen, sieht der Event-Listener des Antwortobjekts dieses Timeout-Ereignis und das Timeout-Ereignis für das Antwortobjekt ausgelöst.

Sie können den Code dafür in the nodejs Github repository sehen.

+0

Vielen Dank für Ihre Erklärung und Ihren Link. Jetzt ist mir der Ablauf ziemlich klar. Flow: Socket-Timeout-Ereignis wird ausgegeben -> Socket-Timeout-Callback -> mit diesem Callback wird ein res-Timeout-Ereignis ausgegeben -> res-Timeout-Callback. – user1384726

+0

@ user1384726 - Ja, das ist es genau. Ein großer Vorteil der Programmierung mit einer Open-Source-Bibliothek ist, dass Sie einfach den Code betrachten können (wenn Sie das richtige Stück Code mit der Suche finden) und genau sehen, was es macht. – jfriend00

+0

Bevor ich bezweifle, gibt es eine Beziehung zwischen "Socket" -Klasse und "Antwort" -Klasse, die das Verhalten verursachen. Ich sehe 'Socket' ist Attribut der 'Antwort' von 'console.log'. Dies ist jedoch NICHT der Fall. Nochmals vielen Dank für Ihre Erklärung. – user1384726