node.js中的SSE在res.end()之前不会触发“消息侦听器”。原因在于代码或

时间:2015-02-10 14:10:38

标签: javascript node.js server-sent-events antivirus

请咨询一下。 客户代码:

var source = new EventSource('/notifications/stream');

    source.addEventListener('open', function(e) {
        console.log('SSE connected')
    }, false);
    source.addEventListener('message', function(e) {
        alert('yes')
        console.log('SSE connected')
    }, false);

服务器代码

// set timeout as high as possible
req.socket.setTimeout(Infinity);

// send headers for event-stream connection
// see spec for more information
res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
});


res.write('\n');

setInterval(function(){
  console.log('writing');
   res.write("id: " + Date.now()  + "\n");
    res.write("data: " + '{"message":"hello world"} ' + "\n\n");
}, 1000);

没有任何作用......但如果我在res.end()客户端触发res.write()一次后添加alert()并且服务器崩溃,因为它已经结束了res。我读到that it might be antivirus's problem我的客户端在连接关闭之前不会触发,因此我关闭了防病毒软件,但它没有帮助。所以我的问题是:

  1. 是代码问题还是其他原因(防病毒)
  2. 如果它是来自防病毒软件,是客户端防病毒还是服务器的防病毒问题? (我正在使用Nod32防病毒软件在Windows上开发,如果我将在Linux上部署,它是否有帮助,或者它取决于客户端的防病毒软件)
  3. 是否有替代但websocket(我唯一的需要是以最少的内存使用量推送通知)
  4. NodeJS版本0.10.28 感谢您的关注。 抱歉英语不好。

1 个答案:

答案 0 :(得分:2)

<强>解决

问题在于中间件&#34;压缩&#34;我在快递中使用的

  

由于压缩的性质,此模块不具备服务器发送事件的开箱即用功能。要压缩内容,需要缓冲输出窗口以获得良好的压缩。通常,在使用服务器发送的事件时,需要访问客户端的某些数据块。

     

您可以通过调用res.flush()来实现此目的,当您需要将所写数据实际发送到客户端时。