为什么Node.js流中有HTTP请求和响应对象?

为什么Node.js流中有HTTP请求和响应对象?,node.js,http,Node.js,Http,我正在尝试学习Node.js的基础知识,我有一个关于HTTP处理的相当幼稚的问题。这是一个基本的echo服务器,通过: 如果我对HTTP一无所知,并且查看了这段代码,我会假设它是某种流式API:有一个输入流(请求)和一个输出流(响应),当数据到达时,这个特定的服务器将输入流的内容重定向到输出流。在引擎盖下,request对象实现了ReadableStream接口,response实现了WriteableStream,这一事实强化了这种印象 但这不是人们传统上看待HTTP的方式!客户端发出单个离散

我正在尝试学习Node.js的基础知识,我有一个关于HTTP处理的相当幼稚的问题。这是一个基本的echo服务器,通过:

如果我对HTTP一无所知,并且查看了这段代码,我会假设它是某种流式API:有一个输入流(
请求
)和一个输出流(
响应
),当数据到达时,这个特定的服务器将输入流的内容重定向到输出流。在引擎盖下,
request
对象实现了
ReadableStream
接口,
response
实现了
WriteableStream
,这一事实强化了这种印象

但这不是人们传统上看待HTTP的方式!客户端发出单个离散请求,然后等待单个离散响应。我不知道在什么情况下,服务器必须在请求被完全读取之前开始编写响应,并且一旦请求被提交,客户端就不能修改请求或直接影响响应

所以我的问题是:

为什么Node.js
请求
响应
对象使用流式API?是否有任何额外的灵活性或功能可以通过充分利用这一事实来实现


如果只看HTTP协议,那么有一种情况是,接收部分会在发送所有数据之前处理数据,这就是
传输编码:chunked

此外,如果您查看HTTP表单,浏览器端streamign仍然有意义。e、 g.对于大型JPEG,如果只传输了部分内容,浏览器就可以开始显示它们,您可以在所有内容发送给您之前开始听音乐


对于节点,原因是为了防止阻塞和高内存使用率,或者如果数据可以作为流处理,则至少允许防止阻塞和高内存使用率。如果请求本地保存的大文件,则不希望将整个文件保存在内存中,也不希望在将所有内容写入文件之前阻止代码。一旦你得到一些数据,你就想把它写到磁盘上。或者,如果您有可以逐行处理以将其保存在数据库中的数据,则也无需等待所有数据

网络连接本身就是流。HTTP请求和响应通常很小,可以放入字符串中,但也可以非常大,甚至无限大

如果请求和响应主体被表示为字符串,这意味着不可能表示更大(或无限大)的主体

为此使用流意味着可以表示任意长度的实体。许多框架提供了一些机制来将这些实体转换为字符串,以便于访问

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);