2012-01-25 52 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()); 

这似乎阻止,并没有什么浏览器中呈现。

编辑:我想浏览器实时连续地显示任何追加到文本文件按照本教程

+0

我已经做了一个编辑来澄清 – deltanovember

+0

是的,因为如果你永远不会调用response.end(),那么永远不会发送响应。 –

+0

在教程中没有response.end(),但新的附加信息似乎'流'到浏览器 – deltanovember

回答

2

你应该尝试使用传输编码卷曲,而不是检验出来:分块。许多Web浏览器不会以块的形式呈现内容,可能是因为以这种方式呈现HTML效率不高。如果您将足够的数据放入响应中,最终浏览器可能会像您期望的那样开始渲染它,但这不是我通常使用的解决方案。

如果您想以您希望的方式将数据流式传输到Web浏览器,那么我会使用websockets或可能对您的流式页面发出的ajax调用,因为它会提供html,因为ajax调用应该每个块的火灾事件。

+0

我已经测试过了,如果包含''Transfer-Encoding':'chunked''头并且推入了足够的数据,那么原始问题中的代码可以很好地与'response.write()'一起工作。尝试添加更多更多数据'temp.txt'使用'less temp.txt >> temp.txt'。我还加入了'Content-Type':'text/plain; charset = UTF-8'',但不确定这是否有所作为。 –

相关问题