我正在尝试text/event-stream
从 express.js 端点发送 SSE 响应。我的路由处理程序如下所示:
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
服务器一起使用,并且它工作正常。所以我想知道是否有某种方法可以绕过 express 对响应对象的包装。