Потоковая передача ответов Http с помощью NodeJS

Я экспериментирую с различными ответами простого 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'), если только уже записанные данные не будут достаточно длинными, поэтому, например, instanceres.write(new Array(2000).join('1')) вместо thatres.write('hello') сработает.

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


person Daniel    schedule 17.03.2012    source источник


Ответы (1)


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

Видите ли вы какие-либо данные, поступающие в инспектор firebug/chrome?

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

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

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

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

person Straseus    schedule 17.03.2012
comment
Вывод .write() оба раза равен true. Этот связанный с вами вопрос предполагает, что это зависит от платформы, есть идеи относительно того, что это будет означать? Инспектор Chrome выводит только завершенное время ответа, одинаковое для обоих случаев. Данные также отображаются до того, как будут прочитаны закрывающие теги, это то же самое поведение при использовании только простого текста. - person Daniel; 17.03.2012
comment
Это зависит от браузера. Попробуйте в разных браузерах. Кроме того, на вкладке сети инспектора Chrome вы сможете увидеть, как данные поступают в режиме реального времени, если вы перезагрузите страницу и щелкнете первый элемент на вкладке сети. Убедитесь, что вы выбрали вкладку предварительного просмотра на правой панели — вот о чем я говорю: imgur.com/8CJD1 - person Straseus; 18.03.2012
comment
Да, похоже, что браузер буферизует ответ. Я попытался выполнить запрос с помощью curl, и это дало ожидаемое поведение (хотя curl, казалось, буферизировался, если в ответе не было окончаний строк \n) - person Daniel; 18.03.2012
comment
@Daniel Вы нашли какое-нибудь решение для этого? - person silkAdmin; 20.03.2012
comment
@silkAdmin Не могу сказать, что я нашел решение проблемы, из-за которой HTTP-ответ буферизуется (по какой-то причине), если он недостаточно велик. Но похоже, что это не проблема с узлом, который, я думаю, отвечает на мой вопрос. - person Daniel; 21.03.2012
comment
Я нашел ответ здесь: stackoverflow.com/questions/6233562/ - person Ivan Lazarevic; 22.07.2013