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