在res.write之后调用res.end()之前,res.write不会发送大数据,但由于它是SSE连接,所以不想结束响应

时间:2019-11-05 13:16:47

标签: node.js express server-sent-events

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;

1 个答案:

答案 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从服务器推送事件。