2012-03-17 82 views
6

我正在试验来自简单NodeJS HTTP服务器的各种响应。 我试图实现的效果是更快的网页视觉渲染。由于响应是通过transfer-encoding: chunked(右?)流式传输到浏览器的,我想我可以首先渲染页面布局,并在延迟后渲染其余数据。使用NodeJS流式传输Http响应

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'),会做的伎俩。

节点是否正在缓存我的写入,直到数据足够大才能发送?如果是这种情况,块大小是否可配置?

回答

3

浏览器在读取结束标记之前可能不会呈现数据。尝试输出纯文本而不是html标签来测试。

你看到任何输入到萤火虫/铬检查器?

Related Question

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

写入字符串与给定的编码流中。如果 字符串已刷新到内核缓冲区,则返回true。返回false到 表示内核缓冲区已满,将来将发送数据到 。

因此输出.write()方法的结果。看看它是否返回true或false。

+0

.write()的输出两次都是“真”。您链接的相关问题表明,这是平台特定的,关于这将意味着什么? 铬检查器只输出完成的响应时间,两种情况都一样。 数据也在结束标记读取之前呈现,这与使用纯文本时的行为相同。 – Daniel 2012-03-17 19:29:33

+1

它是浏览器特定的。在不同的浏览器中试用它。此外,在Chrome检查器的网络选项卡中,如果重新加载页面并单击网络选项卡下的第一项,则应该可以看到数据实时显示。请确保您选择了右侧面板上的预览选项卡 - 以下是我正在讨论的内容:http://imgur.com/8CJD1 – Straseus 2012-03-18 05:26:37

+0

是的,它确定似乎是缓冲响应的浏览器。我试着用curl来运行请求,并且产生了预期的行为,(尽管如果响应缺少行结束符,curl似乎会缓冲)\ n \ n – Daniel 2012-03-18 09:43:50

相关问题