使用NodeJS流式处理Http响应

7

我正在尝试从简单的NodeJS HTTP服务器中尝试不同的响应方式。我希望实现更快速的网页可视化渲染效果。由于响应是通过 transfer-encoding: chunked(对吧?)流式传输到浏览器,因此我想在延迟之后先渲染页面布局,然后再渲染其余数据。

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是否将我的写入缓冲直到数据足够大才发送?如果是这种情况,块大小是否可配置?
1个回答

3

可能是浏览器在读取到结束标签之前不会渲染数据。尝试输出纯文本而不是HTML标记以进行测试。

您是否在Firebug / Chrome Inspector中看到任何输入?

相关问题

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

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

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


.write() 的输出两次都是 true。你提供的相关问题暗示这是平台特定的,你有什么想法吗? Chrome 检查器只输出完成的响应时间,两种情况都一样。 数据在关闭标签之前就已经被渲染出来了,使用纯文本时也是同样的行为。 - Daniel
1
这是浏览器相关的。在不同的浏览器中试一试。此外,在Chrome检查器的网络选项卡中,如果重新加载页面并单击网络选项卡下的第一个项目,您应该能够实时看到数据进入。请确保在右侧面板上选择预览选项卡-这就是我所说的内容:http://imgur.com/8CJD1 - Straseus
是的,看起来确实是浏览器缓冲了响应。我尝试使用curl运行请求,并产生了预期的行为(尽管如果响应缺少换行符\n,curl似乎会进行缓冲)。 - Daniel
@Daniel,你找到解决方法了吗? - silkAdmin
@silkAdmin 不能说我已经找到了解决方案,其中HTTP响应被缓冲(由于某种原因),如果它不够大。但似乎这不是Node的问题,这回答了我的问题。 - Daniel
我在这里找到了答案:https://dev59.com/ZG025IYBdhLWcg3wEhnr - Ivan Lazarevic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接