编程语言
首页 > 编程语言> > javascript-浏览器在服务器关闭连接之前不会响应服务器发送的事件

javascript-浏览器在服务器关闭连接之前不会响应服务器发送的事件

作者:互联网

在Express / Node服务器上,我将内容类型设置为text / event-stream:

res.writeHead(200, {
  'Content-Type': 'text/event-stream'
});

然后,随着一系列回调的触发,我将数据消息写入流,并在其后添加两行:

res.write('data: ' + JSON.stringify(data) + '\n\n');

如果我在服务器端添加日志记录,或者只是用curl命中URL,那么我可以看到数据消息正在写入几秒钟.

但是,当我尝试在网页中使用这些数据消息时,没有任何反应. (我正在Mac上的Chrome,Firefox和Safari上进行测试.)网页如下所示:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Testing</title>
</head>
<body>
  <h1>Server-Sent Events Test</h1>

  <script>
    var source = new EventSource('/library/search?q=medicine&async');
    source.onmessage = function(e) {
      document.body.innerHTML += JSON.parse(e.data).name + '<br>';
    };
  </script>
</body>
</html>

如果我在服务器端添加最后一个关闭连接的回调(使用res.end()),则浏览器将立即响应所有数据消息,并且仅发生一次res.end().这似乎违反了使用服务器发送事件的目的.

我需要更改什么(不放弃并切换到XHR轮询),以使浏览器在服务器发送事件到达时对其做出响应(这似乎是服务器发送事件的目的和用例)?

(表明该问题的测试页可用,但现在此问题已解决,我已将其删除.)

解决方法:

看起来您有一些正在进行压缩的中间件;并且这样做会缓冲直到完成响应.您可以通过curl看到它:

首先,裸GET:

curl <url>

接下来,添加一个Accept-Encoding标头(类似于您的浏览器使用的标头):

curl <url>  -H 'Accept-Encoding: gzip,deflate,sdch' --compressed

请注意,–compressed只是告诉curl为您解压缩它.

您会注意到,您在第一个上看到了预期的行为,但是在第二个上却没有看到.这清楚表明它与压缩有关.我建议关闭该路由的压缩,或者找到一个更聪明的中间件,该中间件知道如何压缩每个帧.

标签:server-sent-events,node-js,express,javascript
来源: https://codeday.me/bug/20191121/2050065.html