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

时间:2016-06-21 21:27:29

标签: node.js http

我正在尝试学习Node.js的基础知识,我对HTTP处理有一个相当天真的问题。这是一个基本的echo服务器,通过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)和一个输出流({{ 1}}),此特定服务器在数据到达时将输入流的内容重定向到输出流。事实证明,response对象实现request界面和ReadableStream实现response

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

所以我的问题是:

  

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

2 个答案:

答案 0 :(得分:1)

网络连接本质上是流。 HTTP请求和响应通常足够小以适合字符串,但是两者都可以非常大,甚至可以无限大。

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

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

答案 1 :(得分:0)

如果仅查看HTTP协议,则在一种情况下,接收方将在发送所有内容之前处理数据,这是针对library(data.table) setDT(Scores)[Grades, Grade := grade, on = .(score), roll = Inf] Scores # a b c score Grade #1: 1.2 2.3 3.4 6.9 C #2: 2.3 3.4 4.5 10.2 B #3: 3.4 4.5 5.6 13.5 A 的。

此外,如果您以HTTP形式查看,浏览器方面的精明仍然是有意义的。例如对于大型jpeg,如果仅传输部分内容,浏览器已经可以开始显示它们,您可以在一切都发送给您之前开始听音乐,...

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