学完了中间件种类,我们来试试自己定义一个中间件,之前我们用中间件进行了req请求数据的解析,用的是第三方的模块中间件,今天我们自己来写一个解析数据的中间件;
1、思路:我们可以通过req.on来对客户端的数据进行监听,在我们自定义的中间件函数里面写:
/1.1 创建自己的中间件函数并且挂载
app.use((req,res,next)=>{
//2.2 定义一个变量存储客户端字符串
let str=''
//2.1 对客户端请求数据的监听
//2.3 进行客户端发送数据的监听
//注意是对客户端对象进行监听,而不是服务器
req.on('data',(chunk)=>{
str+=chunk
})
//2.4 进行发送数据结束的监听
req.on('end',()=>{
//倘若有响应,说明数据发送结束,我们已经拿到所有数据
console.log(str)
})
//2.5 不要忘记需要调用next函数
next()
})
//3.1 编写路由对数据进行测试
app.post('/user',(req,res)=>{
})
我们自定义的变量用来接受客户端的请求数据,而且当我们监听到end的时候说明已经拿到了完整数据;
但是这一串数据我们看不懂:
我们应该拿到下面的数据对象才对,这里用的是post请求,当然你们用get请求也可以;
我们拿到了字符串之后,就可以导入内置的querystring模块的parse()方法来进行解析,然后将返回的对象挂为req.body就可以了;
2、获取数据字符串并且,进行数据的解析
const express=require('express')
const app=express()
//4.1 导入内置模块
const qs=require('querystring')
//自定义解析客户端请求模块
//1.1 创建自己的中间件函数并且挂载
app.use((req,res,next)=>{
//2.2 定义一个变量存储客户端字符串
let str=''
//2.1 对客户端请求数据的监听
//2.3 进行客户端发送数据的监听
//注意是对客户端对象进行监听,而不是服务器
req.on('data',(chunk)=>{
str+=chunk
})
//2.4 进行发送数据结束的监听
req.on('end',()=>{
//倘若有响应,说明数据发送结束,我们已经拿到所有数据
console.log(str)
//4.2 利用内置模块的parser()进行数据解析
const body=qs.parse(str)
//4.3 进行数据对象的挂载
req.body=body
console.log(body)
})
//2.5 不要忘记需要调用next函数
next()
})
//3.1 编写路由对数据进行测试
app.post('/user',(req,res)=>{
//5.1 拿到上游的挂载数据并显示
console.log(req.body)
})
app.listen(8080,()=>{
console.log('express running at http://127.0.0.1:8080')
})
我们通过下面代码成功将数据解析完成,可以看到上面的看不懂的符号变成了下面的对象;
const body=qs.parse(str)
//4.3 进行数据对象的挂载
req.body=body
3、那我们了解怎么写了之后,是不是又要实现一下模块化了,我们接下来就将自定义中间件变成一个模块,这样就更好用了:
//1.1 导入内置模块
const qs=require('querystring')
//1.2 编写解析函数
function myparse(req,res,next){
//2.2 定义一个变量存储客户端字符串
let str=''
//2.1 对客户端请求数据的监听
//2.3 进行客户端发送数据的监听
//注意是对客户端对象进行监听,而不是服务器
req.on('data',(chunk)=>{
str+=chunk
})
//2.4 进行发送数据结束的监听
req.on('end',()=>{
//倘若有响应,说明数据发送结束,我们已经拿到所有数据
console.log(str)
//4.2 利用内置模块的parser()进行数据解析
const body=qs.parse(str)
//4.3 进行数据对象的挂载
req.body=body
console.log(body)
})
//2.5 不要忘记需要调用next函数
next()
}
//1.4 通过module.exports暴露
module.exports=myparse
我们自定义一个模块,将中间件函数放到模块里,别忘了导入内置模块querystring;然后通过module.exports将函数暴露出去,然后在服务器上导入自定义模块并挂在成全局中间件即可;
//2.1 导入自定义解析模块
const myparse=require('./mybody-parse')
//1.1 创建自己的中间件函数并且挂载
app.use(myparse)
通过postman发送数据可以看到结果是一样的;
好了,自定义模块就这些,你们会了吗?
关注我,更多分享