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