Node.js 服务器在未调用 "end()" 服务器发送事件的情况下无法工作
Node.js server did not work without calling "end()" for Server Sent Events
我有一个已配置的 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()
。但是当我从我的代码中删除这一行时,事件不再显示。
这种行为的原因是什么?
目前服务器端事件客户端调用每三秒调用一次,因为这是服务器端关闭连接后的标准重新连接值。
据我了解,服务器端不得关闭连接,而是发送数据,直到客户端获得 'destroyed'.
您必须禁用nginx 的代理缓冲,否则nginx 在响应客户端之前等待响应结束。详情见http://nginx.org/r/proxy_buffering