res.write在调用res.end()之前不发送大数据(发送不完整的数据),但是我不想使用res.end,因为它是SSE API。 我正在使用压缩中间件 (节点版本为8)
let output = null, data = result.data, id = result.id, eventName = result.eventName;
if (typeof data === "object") {
let result = rm.utils.stringify(data);
result = result ? result.split(/[\r\n]+/).map(str => 'data: ' + str).join('\n') : '';
output = (
(id ? "id: " + id + "\n" : "") +
(eventName ? "event: " + eventName + "\n" : "") +
(result || "Not available") + '\n\n'
);
}
res.result = output || data || "";
res.write(output || data || "");
res.flush();
break;
答案 0 :(得分:0)
几件事。首先,我认为您需要在调用res.writeHead
之前先通过res.write
编写标题。其次,默认情况下,不能将连接保持太长时间,因为超时值是由浏览器设置的。如果您在此期间未发送任何数据,则连接将断开。因此,您需要使用res.writeProcessing
let output = null, data = result.data, id = result.id, eventName = result.eventName;
if (typeof data === "object") {
let result = rm.utils.stringify(data);
result = result ? result.split(/[\r\n]+/).map(str => 'data: ' + str).join('\n') : '';
output = (
(id ? "id: " + id + "\n" : "") +
(eventName ? "event: " + eventName + "\n" : "") +
(result || "Not available") + '\n\n'
);
}
res.result = output || data || "";
res.writeHead(200, {'Content-Type': 'application/json'});
res.write(output || data || "");
break;
查看此answer,了解如何使用res.writeProcessing保持连接打开。最后,如果要发送事件,请使用websocket从服务器推送事件。