У меня есть настроенный nginx
экземпляр сервера, который работает вместе с некоторыми Node.js
случаях, как это:сервер Node.js не работает без вызова «конец()» для сервера Sent Events
Nginx часть:
upstream app_nodeSocketServer {
server 127.0.0.1:3001;
}
[...]
location /nodeSocket {
proxy_pass http://app_nodeSocketServer/;
}
Node.js часть:
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!');
});
Итак, если я вызываю http://domain/nodeSocket
, вызывается часть node.js и отображается ответ.
Использование его с сервера отправлено событий:
<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>
Это также работает.
Вопрос
Во всех примерах, которые используют Node.js
вместе с сервером отправлено событий я не вижу ни одной строчки res.end()
. Но когда я удаляю эту строку из своего кода, события, которые больше не отображаются.
В чем причина такого поведения?
В настоящий момент клиентский вызов на стороне сервера вызывается каждые три секунды, поскольку это стандартное значение повторного подключения после того, как серверная сторона закрыла свое соединение.
Насколько я понимаю, серверная сторона не должна закрывать соединение, а отправлять данные до тех пор, пока клиент не будет «уничтожен».
https://nodejs.org/en/about/ событие Самый простой код сервера имеет 'res.end()' –
Посмотрите на 'https://segment.com/blog/2014- 04-03-server-sent-events-the-simpleest-realtime-browser-spec/'или' http://stackoverflow.com/questions/31700336/server-sent-event-eventsource-with-node-js-express '. Нет вызовов 'res.end()'. Для простого сервера узлов вы правы, но не при использовании SSE. Из-за этого вы отказались? – sk2212
Ах, в вашем случае вам нужно отключить буферизацию прокси-сервера nginx, иначе nginx ждет ответа на ответ перед ответом клиенту. См. Http://nginx.org/r/proxy_buffering –