Я пытаюсь отправить ответ SSE text/event-stream
из конечной точки express.js. Мой обработчик маршрута выглядит так:
function openSSE(req, res) {
res.writeHead(200, {
'Content-Type': 'text/event-stream; charset=UTF-8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Transfer-Encoding': 'chunked'
});
// support the polyfill
if (req.headers['x-requested-with'] == 'XMLHttpRequest') {
res.xhr = null;
}
res.write(':' + Array(2049).join('\t') + '\n'); //2kb padding for IE
res.write('id: '+ lastID +'\n');
res.write('retry: 2000\n');
res.write('data: cool connection\n\n');
console.log("connection added");
connections.push(res);
}
Позже я звоню:
function sendSSE(res, message){
res.write(message);
if (res.hasOwnProperty('xhr')) {
clearTimeout(res.xhr);
res.xhr = setTimeout(function () {
res.end();
removeConnection(res);
}, 250);
}
}
Мой браузер делает и удерживает запрос:
Ни один из ответов не передается в браузер. Ни одно из моих событий не запущено. Если я убью сервер express.js. Ответ внезапно истощается, и каждое событие сразу попадает в браузер.
Если я обновлю свой код, чтобы добавить res.end()
после строки res.write(message)
, он правильно очищает поток, однако затем возвращается к опросу событий и не передает ответ.
Я попытался добавить дополнение к заголовку ответа, например res.write(':' + Array(2049).join('\t') + '\n');
, как я видел из другого сообщения SO, которое может заставить браузер истощить ответ.
Я подозреваю, что это проблема с express.js, потому что я ранее использовал этот код с собственным сервером http
узлов, и он работал правильно. Поэтому мне интересно, есть ли способ обойти экспресс-оболочку объекта ответа.
Content-Type
наtext/json
и он волшебным образом заработал. - person Randy   schedule 22.04.2015text/event-stream
код, который, как я знаю, работает. - person Randy   schedule 22.04.2015text/json
. ничего не сделал - person kevzettler   schedule 22.04.2015