为什么在Node.js中,HTTP请求和响应对象要使用流(streams)呢?

3

我正在学习Node.js的基础知识,对于HTTP处理有一个相对幼稚的问题。下面是一个基本的回声服务器,来自nodejs.org:

var http = require('http');

http.createServer(function(request, response) {
  var body = [];
  request.on('data', function(chunk) {
    body.push(chunk);
  }).on('end', function() {
    body = Buffer.concat(body).toString();
    response.end(body);
  });
}).listen(8080);

如果我对HTTP一无所知并查看这段代码,我会认为它是某种流式API:有一个输入流(request)和一个输出流(response),而且这个特定的服务器将输入流的内容重定向到输出流中,随着数据的到来。这种印象得到了加强,因为在幕后,request对象实现了ReadableStream接口,而response则实现了WriteableStream
但这不是传统的HTTP视图方式!客户端发出单一离散请求,然后等待单一离散响应。我不知道是否存在必须在完全读取请求之前开始组合响应的情况,并且一旦提交请求,客户端就无法修改请求或直接影响响应。
所以我的问题是:
Node.js的requestresponse对象为什么使用流API?通过充分利用这一事实,是否可以获得任何附加的灵活性或功能?
2个回答

1
网络连接本质上是流。HTTP请求和响应通常足够小,可以放在一个字符串中,但也可以非常大甚至无限大。
如果将请求和响应主体表示为字符串,则无法表示更大(或无限大小)的主体。
使用流可以表示任意长度的主体。许多框架提供某些机制将这些主体转换为字符串以便更轻松地访问。

0

如果只看HTTP协议,那么有一种情况是接收方在发送所有数据之前会处理数据,这就是Transfer-Encoding: chunked

此外,如果从浏览器端流式传输HTTP,仍然是有意义的。例如,对于大型JPEG图像,浏览器可以在仅传输部分时开始显示它们,您可以在所有内容发送到您之前开始听音乐等等...

对于Node.js,原因是为了防止阻塞和高内存使用率,或者至少允许在数据可以作为流处理时防止这种情况发生。如果您请求要保存在本地的大文件,则不希望将整个文件保存在内存中,并且不希望阻塞代码,直到您将所有内容写入文件。一旦获得了一些数据,您就想将其写入磁盘。或者,如果您有可以逐行处理以将其保存在数据库中的数据,则也没有必要等待所有数据。....


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