如同TCP
一样,HTTP
服务器也抽象了一些事件,以供应用层使用,同样典型的是,服务器也是一个EVentEmitter
实例,它继承自<net.Server>
。
connection
HTTP
请求和响应前,客户端与服务端需要建立底层的TCP
链接,这个链接可能开启了keep-alive
,可以多次 请求响应之间使用,当链接建立时,服务器触发一次该事件 。
request
建立
TCP
连接后,HTTP
模块底层将在数据流中抽象出HTTP
请求和HTTP
响应,当请求数据发送到服务端,在解析出HTTP
请求头后,将会触发该事件;在res.end()
后,TCP
连接可能将用于下一次请求响应。
close
与
TCP
服务器的行为一直,调用server.close()
方法停止接受新的连接,当已有的连接都断开时,触发该事件;可以给server.close()
传递一个回调函数来快速注册该事件。
checkContinue
某些客户端在发送较大的数据时,并不会将数据直接发送,而是先发送一个头部带
Expect:100-continue
的请求到服务器。服务器将会触发checkContinue
事件;如果没有为服务器监听这个事件,服务器将会自定响应客户端100 Continue
的状态码,表示接受数据上传;如果不接受数据的劫夺时,响应客户端400 Bad Request
拒绝客户端继续发送数据即可。需要注意的是,当该事件发生时不会触发request
事件。
connect事件
当客户端发起
CONNECT
请求时触发,而发起CONNECT
请求通常在HTTP
代理时出现;如果不监听该事件,发起该请求的连接将会关闭。
upgrade事件
当客户端要求升级连接的协议时,需要和服务器端协商,客户端会在请求头中带上
Upgrade
字段,服务器端会在接受到这样的请求时触发该事件。同样,如果不监听该事件,发起该请求的连接将会关闭。
ClientError事件
连接的客户端触发
error
事件时,这个错误会传递到服务器端,此时触发该事件。 此事件的监听器负责关闭或销毁底层套接字。
const http = require('http');
const server = http.createServer((req, res) => {
res.end();
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);
当 clientError
事件发生时,没有 request
或 response
对象,因此必须将发送的任何HTTP
响应(包括响应头和有效负载)直接写入socket
对象。 必须注意确保响应是格式正确的 HTTP
响应消息。
err
是Error
实例,有以下两个额外的部分:
-
bytesParsed: Node.js
可能正确解析的请求包的字节数。 -
rawPacket:
当前请求的原始数据包。
网友评论