服务器关闭连接 空响应,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上进行测试.)网页如下所示:

Testing

Server-Sent Events Test

var source = new EventSource('/library/search?q=medicine&async');

source.onmessage = function(e) {

document.body.innerHTML += JSON.parse(e.data).name + '
';

};

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

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

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

解决方法:

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

首先,裸GET:

curl

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

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

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

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

标签:server-sent-events,node-js,express,javascript

来源: https://codeday.me/bug/20191121/2050065.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值