【问题标题】:Node.js HTTP Module: Response + RequestNode.js HTTP 模块:响应 + 请求
【发布时间】:2018-01-05 23:52:45
【问题描述】:

我刚开始观看一些节点教程,我希望帮助理解我从 http.createServer() 获得的响应和请求流。响应和请求是流,这是否意味着 Node.js 以块的形式发送和接收数据?

例如,如果我打电话

res.write("test1");

res.write("test2");

res.end();

它会只在我调用 end() 时写入这两个东西,还是会在我调用 write() 时刷新到流并发送给发出请求的客户端?

另一个详细说明我的问题的例子是,如果我有一个包含大量纯文本数据的 txt 文件,那么我设置了一个读取流,将数据从该文件传输到 res 对象,它将数据以块的形式传输还是执行一旦一切都在缓冲区中。

我想我的问题也适用于请求对象。例如,请求的主体是逐包构建并流式传输到服务器还是一次性发送,节点只是选择让我们使用流来访问它。

非常感谢!

【问题讨论】:

标签: javascript node.js stream


【解决方案1】:

第一次调用 response.write() 时,它会将缓冲的 header 信息和 body 的第一个 chunk 发送给客户端。第二次调用 response.write() 时,Node.js 假定数据将被流式传输,并单独发送新数据。也就是说,响应被缓冲到正文的第一个块。

full foc

所以基本上,如果你 .write() 一小段数据,它可能会被缓冲,直到有一个完整的块或 .end() 被调用。如果 .write() 已经有一个块的大小,它将立即传输。

【讨论】:

  • 我明白了,所以请澄清一下,如果我 response.write() 两次,那么节点将分别发送第二块数据。这就是我们有 res.end() 的原因,所以它知道我什么时候实际上不再发送块,并且可以关闭连接。我想除了澄清之外,我唯一的其他问题也是默认情况下缓冲和流式传输的请求吗?我认为是这种情况,我只需要听 on('data')。
  • @user2814533 是
  • 嗯,我可以再问一件事。当我不包括 res.end() 并且我访问 localhost:3000 时,我什么也没得到,但是当我放 .end() 时,它会显示我写的数据;但是,根据您所说的“第一次调用 response.write(),它会将缓冲的标头信息和正文的第一个块发送给客户端。”不管是否包含 res.end(),我不应该得到第一个 res.write() 的数据吗?
  • @user2814533 也可能取决于您的浏览器,如果它在页面仍在加载时已经显示内容。
  • 我明白了,在调用 end 之前连接不会停止,所以浏览器可能只是说在我拥有所有东西之前我不会加载。我理解你的意思吗?如果是这样,我想我已经回答了所有问题。
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 2013-02-08
  • 2023-03-05
  • 2019-07-20
  • 1970-01-01
  • 2012-12-18
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多