2016-03-23 19 views
0

ile çalışan sunucu tarafı olayları yapamazsınız SSE, nodejs/express uygulamasında çalışamaz. İstemci tarafındaNodejs ve expressjs

app.get('/sse', function (pedido, resposta) { 
    resposta.writeHead(200, { 
    'Content-Type': 'text/event-stream', 
    'Cache-Control': 'no-cache', 
    'Connection': 'keep-alive' 
    }); 
    resposta.write('\n'); 
    global.res = resposta; 
    setInterval(function() { 
    var d = new Date(); 
    global.res.write('id: ' + d.getMilliseconds() + '\n'); 
    global.res.write('data:' + new Date() + '\n\n'); 
    }, 5000); 
}); 

: Ben bu kodları var

//... 
var source = new EventSource('/sse'); 
source.onmessage = function (event) { 
document.getElementById("r").innerHTML = event.data; 
}; 
//... 

Ama çalışmıyor. İstemci tarayıcısında, EvenetSource çağrılır, ancak bir zaman aşımı oluşur. Sunucuda, konsol.logs eklerseniz (her yerde) çalışmakta olduğunu görebiliyorum. Bir şey eksik ve nedenini anlamıyorum. Biri bana yardım edebilir mi? Teşekkür ederim.

+0

teşekkürler yanıt akışı içine() ucunu yazmak gerekir. resposta.end() gibi bir şey; Böylece yanıt müşteriye geri gönderilir. veya resposta.send() kullanın; (veya bu küresel bölümde) –

+0

sizin haklısınız! Bariz olanı özlüyordum! global.res.end(); – user1774309

+0

Olay adını, her bir olayı yalnızca hepsine yanıt vermek üzere nasıl denetleyecek? Ayrıca, bir console.log yazıp (setInterval önce, ben setInterval tetikleyicisi her zaman kayıt defterine yazıyor, yani istemci tarayıcının http isteği almak yinelemek anlamına gelir? – user1774309

cevap

2

Ben eksikti:

setInterval(function() { 
    var d = new Date(); 
    global.res.write('id: ' + d.getMilliseconds() + '\n'); 
    global.res.write('data:' + new Date() + '\n\n'); 
}, 5000);setInterval(function() { 
    var d = new Date(); 
    global.res.write('id: ' + d.getMilliseconds() + '\n'); 
    global.res.write('data:' + new Date() + '\n\n'); 
    resposta.end(); // was missing this 
}, 5000); 

size Code Uniquely