Node 笔记之 HTTP Server

2018年01月21日

http.Server 类

要创建一个 http 服务器,调用http.createServer([requestListener]) 方法,返回一个新建的http.Server 实例。

requestListener 是一个函数,会自动被添加至request事件。即每次服务器收到新的请求,都会调用此函数。

创建一个简单的服务端如下:

1const http = require('http');
2const server = http.createServer((req, res) => {
3  res.end('ok');
4});
5server.listen(8000);

server.listen() 为开启 HTTP 服务器的监听。常用的参数为server.listen([port][, host][, backlog][, callback])backlog 指定待连接队列的最大长度。callback 即回调函数。

server.listening 返回一个布尔值,表示服务器是否正在监听连接。

当服务端每接收到一个请求时,便会触发request 事件。一般即为调用http.createServer() 中传入的requestListener 函数。

http.IncomingMessage 类

requestListener 函数会被传入两个参数,第一个即为IncomingMessage 对象,可用来访问响应状态、消息头和数据等。

message.headers 属性返回请求头的对象。此对象已经被处理过,为头信息的名称与值的键值对,且头信息的名称为小写。而接收到的原始请求会存放在message.rawHeaders 属性中,是[key, value, key2, value2, ...] 的数组,注意是数组,头信息的名称也不会被转换为小写,重复的头信息也不会被合并。

message.httpVersion 返回客户端发送的 HTTP 版本。

message.method 返回一个字符串表示请求的方法,例如:GET, POST

message.url 返回请求的 URL 字符串。注意仅包含 HTTP 请求中的 URL,即不包含域名等信息。解析时可使用require('url').parse(message.url, true),第二个可选参数true 表示从 URL 查询字符串中提取参数,相当于require('querystring').parse

http.ServerResponse 类

该对象在 HTTP 服务器内部被创建,作为第二个参数传入request 事件。

response.writeHead(statusCode[, statusMessage][, headers]) 可显式地发送一个响应头给请求。该方法只能在一个请求中调用一次,且需在response.write()response.end() 之前调用。

也可隐式地发送 HTTP 头部信息,通过设置response.statusCode 属性设置状态码, 通过response.setHeader(name, value) 设置响应头。注意如果setHeader()writeHead() 同时存在,则合并响应头,且writeHead() 具有较高优先级。

头部信息Content-Length 是以字节为单位的,可使用Buffer.byteLength() 来确定字节长度。

response.write(chunk[, encoding][, callback]) 此方法会发送一块响应主体,可被多次调用。

response.end([data][, encoding][, callback]) 表示所有响应头与响应主体已全部发送完毕,每次响应必须包含此方法。之后便会触发finish 事件。