在调用res.end()之前,SSE事件不会到达客户端



以前同样的代码也能工作,但我不知道为什么现在不工作了。请帮忙。

我的问题是,当我使用SSE进行实时数据共享时。应该在res.write(data:${JSON.stringify(dataObject)}nn(上发送的数据对象不会被发送,直到res.end((被调用并且所有数据都是事件流被同时发送。

response.writeHead(200, {
Connection: "keep-alive",
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Access-Control-Allow-Origin": '*',
'Content-Encoding':'identity' // this with and without this
});
let syncher= setInterval(() => { 
if(response.finished){ // If response ended the  interval is cleared
clearInterval(syncher);
return;
}else{
let dataToSend = getEventData(user,event);
if(! dataToSend ){
response.write('data:{close:true}');
clearInterval(syncher);
return;
}
response.write(`data:${JSON.stringify(dataToSend)}nn`);
response.flushHeaders(); // Also tried with response.flush()
if(dataToSend.close){
delEventData(user,event);
response.end();
}
}
}, 500);

上面的代码在服务器端这也有关闭侦听器来关闭连接

const ev = new EventSource(conf.apiUrl+'/getStatus/'+ (userData.id || '') );
let data = '';
ev.onmessage = eventData=>{
data = JSON.parse(eventData.data);
if(!data){
setState('progress '+data.completedSoFar)
return;
}
if(!data.close){
}else{
if(data.success){
console.log('Done Successfully')
ev.close();
}
}

这是我的客户端代码

我不知道为什么当我在互联网上搜索这个问题时,事件监听器没有得到数据流。我只发现当使用压缩中间件时会出现这个问题。我的应用程序中没有使用任何压缩中间件。我使用的是nodejs v11.4.0。我猜,当我制作事件源请求时,chrome默认添加了gzip编码,而node使用它将响应编码标头设置为gzip,我试图删除并替换它,但没有成功,这是导致这个问题的原因吗??

这是我的eventSource请求的请求和响应标头

如果我犯了任何错误,对不起我的语法。

谢谢你的帮助。干杯

Nextjs基本上是在压缩数据,使其传输速度更快。不幸的是,这使得我们在刷新缓存之前无法看到数据(我猜测渲染行为已经改变,因为压缩已经改变了内容(。您可以通过在next.config.中包含compress: false来完全禁用压缩

我在这里发现,包括以下标头可以避开特定端点的压缩:res.setHeader("Cache-Control", "no-cache, no-transform");

注意:这将增加带宽/资源使用量!HTTP压缩可以将数据大小减少70%。

经过大量的调试和研究。问题出现在压缩了我的响应的webpack开发服务器上。有关更多信息,请参阅https://github.com/facebook/create-react-app/issues/966

最新更新