Node.js服务器在没有调用“;end()"用于服务器发送的事件

Node.js server did not work without calling "end()" for Server Sent Events

本文关键字:服务器 quot 用于 事件 end js 调用 Node      更新时间:2023-10-13

我有一个配置的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()。但当我从代码中删除这一行时,事件就不再显示了。

这种行为的原因是什么?

目前,每三秒调用一次服务器端事件客户端调用,因为这是服务器端关闭连接后的标准重新连接值。

据我所知,服务器端不能关闭连接,而是在客户端被"破坏"之前发送数据。

您必须禁用nginx的代理缓冲,否则nginx在响应客户端之前等待响应结束。看见http://nginx.org/r/proxy_buffering有关详细信息,