【问题标题】:Node.js server did not work without calling "end()" for Server Sent EventsNode.js 服务器在不为服务器发送事件调用“end()”的情况下无法工作
【发布时间】: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


【解决方案1】:

你必须禁用 nginx 的代理缓冲,否则 nginx 会在响应客户端之前等待响应结束。详情见http://nginx.org/r/proxy_buffering

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2015-10-24
    • 2020-11-04
    • 2010-10-12
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多