2015-02-10 14 views
1

請諮詢someting。 客戶端代碼:node.js中的SSE在res.end()之前不會觸發「消息偵聽器」。原因是在代碼或

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); 

Server代碼

// 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以外,還有其他選擇嗎(我只需要推送內存最少的通知)

NodeJS版本0.10.28 感謝您的關注。 抱歉,糟糕的英語。

回答

2

解決

的問題是,我在快遞

使用,因爲壓縮的性質此模塊不開箱即用服務器發送的事件工作的中間件「壓縮」 。爲了壓縮內容,輸出的窗口需要被緩衝以獲得良好的壓縮。通常在使用服務器發送的事件時,需要到達客戶端的某些數據塊。

您可以通過調用res.flush()來實現此目的,當您需要寫入數據以實際將其寫入客戶端時。

相關問題