2013-04-24 1 views
2

В Узел веб-сервер, я хочу, чтобы очистить содержимое HTML в определенных точках следующим образом:Как очистить куски произвольных размеров в NodeJS

  • первый кусок: <html><head> ... </head>
  • второй порции: <body> ... </body>
  • третьего кусок: </html>

например:

var http = require('http'); 

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 

    res.write('<html><head> ... </head>');           

    setTimeout(function() {               
    res.write('<body> ... </body>');            

    setTimeout(function() {               
     res.end('</html>');               
    }, 2000);                  

    }, 2000); 

}).listen(8000); 

Код выше отвечает <html><head> ... </head><body> ... </body></html> после ~ 4s в один блок, однако я заметил, куски должны быть> = 4096bytes для того, чтобы промыть немедленно:

var http = require('http'); 

http.createServer(function (req, res) {            
    res.writeHead(200, {'Content-Type': 'text/plain'});        

    res.write(Array(4097).join('*')); 

    setTimeout(function() {               
    res.write(Array(4097).join('#')); 

    setTimeout(function() {               
     res.end('done!');                
    }, 2000); 

    }, 2000); 

}).listen(8000); 

Отклик из кода выше, также занимает ~ 4s, но куски немедленно смываются. Я мог бы накладывать небольшие куски, чтобы заполнить как минимум 4096 байт, просто интересно, есть ли другой «не-хакерский» способ.

В PHP это может быть достигнуто за счет flush()/ob_flush() и отключение output_buffering

FWIW, я строю инструмент веб-сервер для эксперимента несколько конфигураций выхода куска HTML с заданной задержкой между ними для того, чтобы проанализировать, как современные браузеры обрабатывают его и выбирают оптимальную конфигурацию.

Благодаря

ответ

5

Это полу-дубликат this question.

Ответ заключается в том, что он уже делает то, что вы хотите, это просто, что браузер не анализирует и не отображает все, пока не получит достаточное количество данных, чтобы беспокоиться о его синтаксическом анализе. Отправка ваших кусков 4097 дает браузеру толчок для анализа части документа, это не толкает узел, чтобы отправлять куски по-разному.

Вы можете проверить это, используя curl, если вы поместите его в режим без буферизации.

curl -N localhost:8000 
+0

Спасибо! Похоже, что завиток по умолчанию забивает куски размером не менее 4 тыс., С другой стороны, для Chrome требуется, чтобы 1-й кусок был как минимум 1к, тогда предстоящие куски могут быть меньше этого. – marcelduran