【发布时间】:2016-03-31 07:57:36
【问题描述】:
我有一个已配置的 nginx 服务器实例,它与一些 Node.js 实例一起工作,如下所示:
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()。但是当我从我的代码中删除这一行时,不再显示的事件。
这种行为的原因是什么?
此时每三秒调用一次服务器端事件客户端调用,因为这是服务器端关闭连接后的标准重新连接值。
据我了解,在客户端被“销毁”之前,服务器端不得关闭连接,而是发送数据。
【问题讨论】:
-
nodejs.org/en/about事件最简单的服务器代码有
res.end() -
看看
https://segment.com/blog/2014-04-03-server-sent-events-the-simplest-realtime-browser-spec/或http://stackoverflow.com/questions/31700336/server-sent-event-eventsource-with-node-js-express。没有res.end()电话。对于一个简单的节点服务器,你是对的,但在将它与 SSE 一起使用时却不是。您是否因此而投反对票? -
啊,在您的情况下,您必须禁用 nginx 的代理缓冲,否则 nginx 会在响应客户端之前等待响应结束。见nginx.org/r/proxy_buffering
-
是的,这行得通。你能提供这个作为答案吗?
标签: javascript node.js nginx server-sent-events