最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 11浏览 0评论

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

以前使用过相同的代码,但是我不知道为什么现在不起作用。请帮助。

[我的问题是,当我使用SSE进行实时数据共享时。应在res.write(data:${JSON.stringify(dataObject)}\n\n)上发送的数据对象直到调用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)}\n\n`);
        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 '+datapletedSoFar)
      return;
    }
    if(!data.close){

    }else{
      if(data.success){
        console.log('Done Successfully')
      ev.close();
    }
  }

这是我的客户端代码

我不知道为什么我在Internet上搜索此问题时事件监听器为什么没有获取数据流,我才发现使用压缩中间件时会发生此问题。我在我的应用程序中未使用任何压缩中间件。我正在使用nodejs v11.4.0。我猜想当我在进行事件源请求时,chrome默认情况下会添加gzip编码,而节点使用它来将响应编码标头设置为gzip时,我试图删除并替换它,但没有起作用,这导致了此问题?

Here is my request and response headers for eventSource request

抱歉,如果我有任何错误,我的语法。

感谢您的帮助。干杯!

回答如下:

经过大量的调试和研究。问题出在压缩我的响应的webpack-dev-server中。有关更多信息,请参考https://github/facebook/create-react-app/issues/966

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

以前使用过相同的代码,但是我不知道为什么现在不起作用。请帮助。

[我的问题是,当我使用SSE进行实时数据共享时。应在res.write(data:${JSON.stringify(dataObject)}\n\n)上发送的数据对象直到调用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)}\n\n`);
        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 '+datapletedSoFar)
      return;
    }
    if(!data.close){

    }else{
      if(data.success){
        console.log('Done Successfully')
      ev.close();
    }
  }

这是我的客户端代码

我不知道为什么我在Internet上搜索此问题时事件监听器为什么没有获取数据流,我才发现使用压缩中间件时会发生此问题。我在我的应用程序中未使用任何压缩中间件。我正在使用nodejs v11.4.0。我猜想当我在进行事件源请求时,chrome默认情况下会添加gzip编码,而节点使用它来将响应编码标头设置为gzip时,我试图删除并替换它,但没有起作用,这导致了此问题?

Here is my request and response headers for eventSource request

抱歉,如果我有任何错误,我的语法。

感谢您的帮助。干杯!

回答如下:

经过大量的调试和研究。问题出在压缩我的响应的webpack-dev-server中。有关更多信息,请参考https://github/facebook/create-react-app/issues/966

发布评论

评论列表 (0)

  1. 暂无评论