res.write не отправляет большие данные до тех пор, пока res.end () не будет вызван после res.write, но не хочет завершать ответ, потому что это соединение SSE - PullRequest
0 голосов
/ 05 ноября 2019

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 голосов
/ 05 ноября 2019

Несколько вещей. Прежде всего, я думаю, что вам нужно сначала написать заголовки на 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;

Посмотрите на этот ответ , чтобы увидеть, как вы можете держать соединение открытым с помощью res.writeProcessing. Наконец, если вы хотите отправлять события, используйте веб-сокет для отправки событий с сервера.

...