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.
https://nodejs.org/en/about/ Ereignis der einfachste Server-Code hat 'res.end()' –
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
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 –