Nodejs小案例: HTTP Transfer-Encoding

540 阅读1分钟

我们在HTTP中面对大文件的传输时常常有以下的解决方式:

  • 数据压缩头字段Accept-Encoding 通过gzip、br等压缩算法来压缩文件大小,主要针对的是文本数据

  • 范围请求头字段Accept-Range、Range,常见的响应码为206,可用于视频流之类的下载;

假如我们面对这样一种场景:服务端返回的数据是动态生成的、无法在“Content-Length”给出长度,且不希望在服务器中占用大量内存,就可采用分块传输

示例代码如下:

const http = require("http");

const server = http.createServer((req, res) => {
    res.setHeader("Content-Type", "text/html;charset=utf-8");
    res.setHeader("Transfer-Encoding", "chunked");
  
    res.write("<p>hello</>");
  
    setTimeout(() => {
      res.write("第一次传输<br />");
    }, 1000);
  
    setTimeout(() => {
      res.write("第二次传输<br />");
    }, 2000);
  
    setTimeout(() => {
      res.write("第三次传输<br />");
    }, 3000);
  
    setTimeout(() => {
      res.write("第四次传输<br />");
    }, 4000);
  
    setTimeout(() => {
      res.write("第五次传输");
      res.end();
    }, 5000);
  }
});


server.listen(8000, () => {
  "server start in port 8000";
});

效果如图:

注意:

  1. Transfer-Encoding: chunked和Content-Length是不能同时存在,只能其中一个起作用

如果有好的实际使用场景或案例,可在评论区分享😄