ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-21 07:37:03  阅读:195  来源: 互联网

标签:server-sent-events node-js express 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有