1. 创建简单服务
const http = require('http')
http.createServer( (req, res) => {
res.write('hello world')
res.end()
} ).listen( 3000, () => {
console.log('server is running...')
} )
2. res 和 req 对象
-
req
req 是 request 的简称,代表的是客户端的请求对象。下面是 req 对象的继承关系。
req => IncomingMessage => Stream.Readable
可以看到,req 继承自 InComingMessage,其上的方法和属性可在 Nodejs 官网看到。
http.IncomingMessage 类
IncomingMessage
对象是由 http.Server
或者 http.ClientRequest
创建,并且作为第一个参数传递给 'request' 和 'response' 事件。可用于访问应用状态,消息头,以及数据等。
API | 描述 | 备注 |
---|---|---|
aborted 事件 | 当请求中止时出发 | |
close | 当底层连接关闭时触发 | |
message.aborted | 当请求被中止时,为 true。否则为 false | |
meaage.complete | 如果已接受并且成功的解析了 HTTP 消息,则为 true,否则为 false | 可用来检测当连接关闭时,数据流是否传递完毕 |
message.destory([error]) | 在接收到的 IncomingMessage 套接字上使用 destory() |
如果提供了 error ,则会触发 'error'事件,并将 error 作为参数传递给事件监听函数 |
message.headers | 请求或者响应的消息头对象 | 消息头的名称和值的键值对,消息头的名称都是小写 |
message.httpVersion | 在服务器的请求中,表示的是客户端发送的 HTTP 版本 | |
message.method | 表示客户端 http 动词('GET') | 仅对 http.Server 获取的请求有效 |
message.rawHeaders | 表示原始请求头/响应头,与接收到的完全一致。 | 键值对位于一个数组中,奇数元素表示键,偶数元素表示值 |
message.statusCode | 获取响应的状态码 | 仅在 http.ClientRequest 的响应中可以获取到 |
message.statusMessage | 获取响应的状态信息,如 OK | 仅在 http.ClientRequest 的响应中可以获取到 |
message.url | 获取请求的路径,如 '/status?p=1' | 仅在Http.Server 的 req 中可以访问的到 |
流(stream)会在后面的文章中介绍。
- res
res 是 response 的简称,是 http.Server 的响应对象,下面是它的继承关系。
res => ServerResponse => OutgoingMessage => stream
很明显,ServerResponse 的方法和属性,就是 res 所具备的属性和方法。
http.ServerResponse 类
此对象由 HTTP 对象内部创建,不需要用户自建。并作为 http.Server 的 'request' 事件的第二个参数。
API | 描述 | 备注 |
---|---|---|
close 事件 | 底层连接被关闭时触发 | |
finish 事件 | 响应发送后触发 | 当响应头和主体的最后一段已经切换到操作系统以通过网络传输时,触发该事件。 这并不意味着客户端已收到任何信息。 |
response.end([data[, encoding[,callback]]]) | 此方法向服务器发送信号,表明以发送所有响应头和主体。这时,服务器会视为请求已经发送完毕。 | 必须为在每个响应调用 response.end()。如果指定了 data ,则相当于调用 response.write(data, encoding)后,再调用 response.end()。如果指定了 callback ,则会在响应流完成后调用它。 |
response.finish | 如果调用了 response.end() 则此属性为 true |
|
response.flushHeader() | 刷新响应头 | 可参阅request.flushHeaders() 。 |
response.getHeader(name) | 读出以排队,但未发送的响应头 | 该名称不区分大小写。返回值的类型取决于提供给 response.setHeader() 的参数 |
response.getHeaderNames() | 获取所有响应头键值数组 | 所有键都是小写 |
response.getHeaders() | 获取所有响应头的键值对集合 | 键都是小写 |
response.hasHeader(name) | 响应头中包含此头信息时返回 true | 响应头不区分大小写 |
response.headerSent | 只读布尔值,响应头已发送为 true,否则为 false | |
response.removeHeader(name) | 移除队列中等待的对应响应头 | 响应头不区分大小写 |
response.sendDate | 为 true时。Date 会自动生成并包含在响应头中 | 一般不做更改 |
response.setHeader(name, value) | 为隐式响应头设置单个响应头的值。 如果此响应头已存在于待发送的响应头中,则其值将被替换。 | 在这里可以使用字符串数组来发送具有相同名称的多个响应头。 非字符串值将被原样保存。 因此 response.getHeader() 可能返回非字符串值。 但是非字符串值将转换为字符串以进行网络传输。 |
response.setTimeout(ms[,callback]) | 将套接字的超时时间设置为 ms。 | 如果提供了回调函数,则将其添加到响应对象的 'timeout' 事件监听器上 |
response.scoket | 指向底层套接字。通常不需要用户直接调用 | |
response.statusCode | 当没有调用 response.writeHeader() 设置时,可以进行赋值 |
默认值是 200。响应头发送到客户端后,表示的是已经发送的状态码 |
response.statusMessage | 直接赋值改变发送到客户端的响应信息 | 用于隐式改变,显式时使用 response.writeHeader() 。当没有改变是,默认是 'Not Found' |
response.writableFinished | 如果在触发 'finish' 之前,所有数据都已经刷新到底层,则为 true
|
|
response.write(chunk[,encoding[,callback]]) | 这回发送一块影响体。可以提供连续的响应体。 | 如果在调用此方法之前未调用 response.writeHeader() ,则将切换到隐式响应头模式并刷新隐式响应头 |
response.writeHead(statusCode[,statusMessage[],headers]) | 向请求发送响应头 | 返回对 ServerResponse 的引用,以便可以链式调用。此方法只能在消息上调用一次,并且必须在调用 response.end() 之前调用。 |
总结
res 和 req 是请求和响应的基础,本文的以上部分来自 node 官网,有不懂的或者不全的部分,需要自行学习。