我正在尝试学习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
WriteableStream
和request
对象使用流API?是否有任何额外的灵活性或功能可以通过充分利用这一事实来实现?
答案 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,如果仅传输部分内容,浏览器已经可以开始显示它们,您可以在一切都发送给您之前开始听音乐,...
对于节点,原因是为了防止阻塞和较高的内存使用,或者至少是要防止是否可以将数据作为流处理。如果您请求要保存在本地的大文件,则您不想将整个文件保留在内存中,也不想在将所有内容都写入文件之前就阻止代码。一旦获得一些数据,就想将其写入磁盘。或者,如果您有可以逐行处理以将其保存到数据库中的数据,则也无需等待所有数据。 ....