Page 79 - Node.js开发指南
P. 79
4.5 HTTP 服务器与客户端 71
request:当客户端请求到来时,该事件被触发,提供两个参数 req 和res,分别是 1
http.ServerRequest 和 http.ServerResponse 的实例,表示请求和响应信息。
connection:当 TCP 连接建立时,该事件被触发,提供一个参数 socket,为
net.Socket 的实例。connection 事件的粒度要大于 request,因为客户端在
2
Keep-Alive 模式下可能会在同一个连接内发送多次请求。
close :当服务器关闭时,该事件被触发。注意不是在用户连接断开时。
除此之外还有 checkContinue、upgrade、clientError 事件,通常我们不需要关
心,只有在实现复杂的 HTTP 服务器的时候才会用到。
3
在这些事件中,最常用的就是 request 了,因此 http 提供了一个捷径:
http.createServer([requestListener]) ,功能 是创建一 个 HTTP 服 务器并将
requestListener 作为 request 事件的监听函数,这也是我们前面例子中使用的方法。
事实上它显式的实现方法是: 4
//httpserver.js
var http = require('http');
5
var server = new http.Server();
server.on('request', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
6
res.end('<p>Hello World</p>');
});
server.listen(3000);
console.log("HTTP server is listening at port 3000.");
7
2. http.ServerRequest
http.ServerRequest 是 HTTP 请求的信息,是后端开发者最关注的内容。它一般由
http.Server 的 request 事件发送,作为第一个参数传递,通常简称 request 或 req。
ServerRequest 提供一些属性,表 4-2 中列出了这些属性。 8
HTTP 请求一般可以分为两部分:请求头(Request Header)和请求体(Requset Body)。
以上内容由于长度较短都可以在请求头解析完成后立即读取。而请求体可能相对较长,
需要一定的时间传输,因此 http.ServerRequest 提供了以下3个事件用于控制请求体 9
传输。
data :当请求体数据到来时,该事件被触发。该事件提供一个参数 chunk,表示接
收到的数据。如果该事件没有被监听,那么请求体将会被抛弃。该事件可能会被调
10
用多次。