2016-03-31 4 views
-1

Aufruf Ich habe einen konfigurierten nginx Server-Instanz, die mit einigen Node.js Instanzen funktioniert wie folgt zusammen:Node.js Server funktionierten nicht ohne "end()" für Server Sent Events

nginx Teil:

upstream app_nodeSocketServer { 
    server 127.0.0.1:3001; 
} 

[...] 

location /nodeSocket { 
    proxy_pass http://app_nodeSocketServer/; 
} 

Node.js Teil:

var express = require('express'); 
var app = express(); 
var os = require("os"); 


app.get('/', function (req, res) { 

    res.writeHead(200, { 
     "Content-Type": "text/event-stream", 
     "Cache-Control": "no-cache", 
     "Connection": "keep-alive" 
    }); 

// var interval = setInterval(function() { 
     res.write("data: Uptime: " + os.uptime() + "\n\n"); 
     res.end(); 
// }, 1000); 


    /* req.connection.addListener("close", function() { 
     clearInterval(interval); 
    }, false);*/ 

}); 


app.listen(3001, function() { 
    console.log('Example app listening on port 3001!'); 
}); 

Wenn ich also http://domain/nodeSocket aufrufe, wird der Teil node.js aufgerufen und eine Antwort wird angezeigt.

Verwendung mit Server gesendet Ereignisse:

<html> 
<head> 
</head> 
<body> 

<h1>Getting server updates</h1> 
<div id="result"></div> 

<script> 

    var url = "http://domain/nodeSocket"; 
    var source = new EventSource(url); 
    source.onmessage = function(event) { 
     console.log(event.data); 
     document.getElementById("result").innerHTML = event.data + "<br>"; 
    }; 
</script> 

Dies auch funktioniert.

Frage

In allen Beispielen, die Node.js zusammen mit Server gesendet Ereignisse verwende ich sehe keine Linie res.end(). Aber wenn ich diese Zeile aus meinem Code entferne, werden die Ereignisse nicht mehr angezeigt.

Was ist der Grund für dieses Verhalten?

Im Moment wird der Server-seitige Ereignis-Client-Aufruf alle drei Sekunden aufgerufen, da dies der Standard-Wiederverbindungswert ist, nachdem die Serverseite ihre Verbindung geschlossen hat.

Wie ich verstehe, darf die Serverseite die Verbindung nicht schließen, sondern Daten senden, bis der Client "zerstört" wird.

+0

https://nodejs.org/en/about/ Ereignis der einfachste Server-Code hat 'res.end()' –

+0

Werfen Sie einen Blick auf 'https://segment.com/blog/2014- 04-03-server-sent-events-the-simpleste-realtime-browser-spec/'oder' http://stackoverflow.com/questions/31700336/server-sent-event-eventsource-with-node-js-express '. Es gibt keine 'res.end()' Aufrufe. Für einen einfachen Node-Server haben Sie Recht, aber nicht, wenn Sie SSEs verwenden. Hast du deswegen runtergestimmt? – sk2212

+0

Ah, in Ihrem Fall müssen Sie die Proxy-Pufferung von Nginx deaktivieren, sonst wartet nginx auf das Ende der Antwort, bevor der Client antwortet. Siehe http://nginx.org/r/proxy_buffering –

Antwort

1

Sie müssen die Proxy-Pufferung von Nginx deaktivieren, andernfalls wartet nginx auf das Ende der Antwort, bevor der Client antwortet. Siehe http://nginx.org/r/proxy_buffering für Details

Verwandte Themen