开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
HttpServer事件
http.server是一个基于事件的HTTP服务器,所有的请求都被封装到事件中,调用事件就能完成所有功能
常用事件
1.request事件 : 当客户端有请求的时候会触发request事件,该事件提供两个参数,request和response,分别是http.serverRequest和http.serverResponse表示请求信息和响应信息
2.connection事件 : 当TCP建立连接的时候,触发该事件,提供一个参数socket,为net.socket实例
3.close: 当服务器关闭的时候触发
http中使用reqest事件
const http = require('http')
const net = require('net')
const util = require('util')
const server = new http.Server()
server.on('request',function(req,res) => {
console.log(req.url)
})
server.on('connection', () => {
console.log('connection')
})
server.on('close', () => {
console.log('server close')
})
除了事件监听,http还给request事件提供了一个便捷方式
http.createServer([requestLisetener])
const http = require('http')
const net = require('net')
const util = require('util')
http.createServer(function(req,res) => {
console.log(req.url)
})
http.serverRequest的请求信息
http请求分为两部分,请求头和请求体,如果请求的内容较少就会在请求协议完成之后立即读取请求内容较多时,请求体需要时间传输,所以,http提供了三个事件用于控制请求体传输
-
data : 当请求体数据到来时该事件触发,该事件只有一个参数chunk,表示接收到的数据
2.end: 当请求体数据传输完成时,触发该事件,此后将不会再有数据到来
3.close : 当用户请求结束时,该事件触发,和end不同,当用户强行终止传输,该事件也会触发
| 名称 | 含义 | |
|---|---|---|
| ccomplete | 客户端请求是否已经发送完成 | |
| httpVersion | HTTP协议版本,通常是1.0或者1.1 | |
| method | HTTP请求方法,如:GET或,POST | |
| url | 原始的请求路径 | |
| headers | HTTP请求头 | |
| trailers | HTTP请求尾(不常见) | |
| connection | 当前HTTP连接的套接字,为net.Socket的实例 | |
| socket | connection属性的别名 | |
| client | client属性的别名 |
获取GET请求的内容
由于GET请求直接嵌套在路径中,包括了?和面的部分,nodejs中的url模块中的parse函数可以解析
const net = require('net');
const url = require('url');
const util = require('util');
http.createServer((req,res)=>{
res.write(util.inspect(url.parse(req.url,true)));
//利用url模块去解析客户端发送过来的URL
res.end(util.inspect(url.parse(req.url,false)));
}).listen(8080);
获取POST请求的内容
POST请的内容全部在请求体中,http.serverRequest中并没有任何一个属性的内容是请求体,因为等待请求体传输可能是一件耗时的工作,比如上传文件,恶意的POST请求会大大消耗服务器的资源,所以nodeJS不会解析请求体,需要开发者手动解析
const http = require('http')
const net = require('net')
const url = require('url')
const util = require('util')
const querystring = require('querystring')
http.createServer((req,res) => {
const postData = ''
req.on('data' , (chunk) => {
postData += chunk;
})
req.on('end', () => {
//将字符串变为json格式
post = querystring.parse(postData)
//向前端返回字符串
res.end(util.inspect(postData))
})
})