2012-01-25 2 views
0

Я пытаюсь следовать учебник здесь:Почему response.write блокирует мой браузер в Node.js?

http://nodetuts.com/tutorials/2-webtail-nodejs-child-processes-and-http-chunked-encoding.html#video

Следующий код работает

var http = require('http'); 
var spawn = require('child_process').spawn; 

http.createServer(
function (request, response) { 
    response.writeHead(200, { 
     'Content-Type':'text/plain' 
    }); 
    var tail_child = spawn('tail', ['-f', 'temp.txt']); 

    request.connection.on('end', function() { 
     tail_child.kill(); 
    }); 

    tail_child.stdout.on('data', function (data) { 
     console.log(data.toString()); 
     response.end(data.toString()); 

    }); 

}).listen(9000); 

Однако браузер не получает обновления temp.txt. Если я заменяю

response.end(data.toString()); 

с

response.write(data.toString()); 

Это, как представляется, блокировать и ничего не отображается в браузере.

Edit: Я хотел бы браузер, чтобы непрерывно отображать любые дописывает в текстовом файл в режиме реального времени в соответствии с обучающей

+0

Я сделал редактирование для уточнения – deltanovember

+0

Да, потому что, если вы никогда не вызываете 'response.end()' ответ никогда не отправляется. –

+0

В учебнике отсутствует response.end(), но новые приложения появляются в потоке в браузере – deltanovember

ответ

2

Вы должны попытаться использовать локон вместо того, чтобы проверить Transfer-Encoding: фрагментированным. Многие веб-браузеры не будут отображать содержимое в кусках, возможно, потому, что на самом деле не так эффективно отображать HTML. Если вы добавите достаточное количество данных в ответ, браузер может начать рендеринг, как вы ожидали, но это не решение, которое я бы использовал обычно.

Если вы хотите передавать данные в веб-браузер так, как вы надеетесь, я бы использовал веб-узлы или, возможно, ajax-вызов, сделанный на вашей потоковой странице, который будет отображать html по мере его поступления, поскольку вызов ajax должен для каждого куска.

+0

Я проверил это, и код в исходном вопросе отлично работает с 'response.write()', если вы включаете заголовок '' Transfer-Encoding ':' chunked'' и нажимаете достаточно данных. Попробуйте добавить много больше данных 'temp.txt', используя' less temp.txt >> temp.txt'. Я также добавил ''Content-Type': 'text/plain; charset = UTF-8'', но не уверен, что это изменило ситуацию. –