2012-03-17 2 views
6

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

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 буферизацию моих записей до тех пор, пока данные не будут достаточно значительными для отправки? Если это так, настраивается ли размер блока?

ответ

3

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

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

Related Question

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

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

Вывести результаты .write() методов. Посмотрите, возвращает ли он true или false.

+0

Выходной сигнал .write() является «истинным» оба раза. Этот связанный с вами вопрос связан с тем, что это специфическая платформа, любая идея относительно того, что это будет означать? Контроллер хрома выводит только завершенное время отклика, то же самое для обоих случаев. Данные также отображаются перед чтением закрывающих тегов, это то же поведение при использовании только обычного текста. – Daniel

+1

Это конкретный браузер. Попробуйте в разных браузерах. Кроме того, на вкладке сети инспектора хрома вы должны увидеть, что данные в реальном времени обновляются, если вы перезагрузите страницу и щелкните первый элемент под вкладкой сети. Убедитесь, что вы выбрали вкладку предварительного просмотра на правой панели - вот что я говорю: http://imgur.com/8CJD1 – Straseus

+0

Да, похоже, что браузер поддерживает буферизацию ответа. Я попробовал запустить запрос с завитком, и это вызвало ожидаемое поведение (хотя завиток, казалось, был буферным, если в ответе отсутствовали строки-окончания '\ n') – Daniel

Смежные вопросы