Потоковая Http-ответы с NodeJS - PullRequest
6 голосов
/ 17 марта 2012

Я экспериментирую с различными ответами от простого HTTP-сервера NodeJS. Эффект, которого я пытаюсь достичь, - более быстрая визуализация веб-страницы. Поскольку ответ передается в браузер с помощью transfer-encoding: chunked (верно?), Я подумал, что смогу сначала отобразить макет страницы и остальные данные после задержки.

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {
        'Content-Type': 'text/html'
        , 'Transfer-Encoding': 'chunked'
    });
    res.write('<html>\n');
    res.write('<body>\n');
    res.write('hello ');
    res.write('</body>\n');
    res.write('</html>\n');
    setTimeout(function () {
        res.end('world');
    },1500);
}).listen(3000, '127.0.0.1');

Дело в том, что кажется, что ответ не отправляется до res.end('world'), если только уже записанные данные не являются достаточно длинными, так что, например, res.write(new Array(2000).join('1')) вместо этого res.write('hello') сделает свое дело.

Node буферизует мои записи до тех пор, пока данные не станут достаточно большими для отправки? Если это так, настраивается ли размер чанка?

1 Ответ

3 голосов
/ 17 марта 2012

Возможно, что браузер не рендерит данные, пока закрывающие теги не будут прочитаны.Попробуйте вывести простой текст вместо тегов html, чтобы проверить это.

Видите ли вы какие-либо входящие данные в Firebug / Chrome Inspectler?

Связанный вопрос

http://nodejs.org/api/stream.html#stream_stream_write_string_encoding_fd:

Записывает строку с заданной кодировкой в ​​поток.Возвращает true, если строка была сброшена в буфер ядра.Возвращает false, чтобы указать, что буфер ядра заполнен, и данные будут отправлены в будущем.

Итак, выведите результаты методов .write().Посмотрите, вернет ли он истину или ложь.

...