【问题标题】:Why are HTTP request and response objects in Node.js streams?为什么 Node.js 流中有 HTTP 请求和响应对象?
【发布时间】:2019-08-07 03:46:39
【问题描述】:

我正在尝试学习 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 request 和 response 对象使用流式 API?是否有任何额外的灵活性或功能可以通过充分利用这一事实来实现?

【问题讨论】:

    标签: node.js http


    【解决方案1】:

    网络连接本质上是流。 HTTP 请求和响应通常小到可以放入一个字符串,但两者也可以非常大,甚至无限大。

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

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

    【讨论】:

      【解决方案2】:

      如果您只看 HTTP 协议,那么在一种情况下,接收部分会在发送所有内容之前处理数据,那就是 Transfer-Encoding: chunked。

      此外,如果您从 HTTP 表单中查看浏览器端 streamign 仍然是有意义的。例如对于大型 jpeg 浏览器,如果仅传输部分内容,则已经可以开始显示它们,您可以在将所有内容发送给您之前开始听音乐,...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多