3

在 Node Web 服务器中,我想在特定点刷新 HTML 内容,如下所示:

  • 第一个块:<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);

上面的代码在单个块中约 4 秒后响应<html><head> ... </head><body> ... </body></html>,但是我注意到块应该 >= 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);

上面代码的响应也需要大约 4 秒,但块会立即刷新。我可以填充小块以填充至少 4096 字节,只是想知道是否还有另一种“非 hacky”方式。

在 PHP 中,这可以通过flush()/ob_flush()和禁用来实现output_buffering

FWIW,我正在构建一个 Web 服务器工具来试验 HTML 块输出的几种配置,它们之间具有给定的延迟,以便分析现代浏览器如何处理它并选择最佳配置。

谢谢

4

1 回答 1

8

这是一个半重复的这个问题

答案是已经做了你想要的,只是浏览器不会解析和显示任何东西,直到它收到足够的数据来解析它。发送 4097 块可以让浏览器推动解析部分文档,它不会推动 Node 以不同的方式发送块。

curl如果您将其置于非缓冲模式,您可以使用它进行测试。

curl -N localhost:8000
于 2013-05-01T04:56:15.220 回答