学完了中间件种类,我们来试试自己定义一个中间件,之前我们用中间件进行了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',()=>{
- //倘若有响应,说明数据发送结束,我们已经拿到所有数据
- -variable language_">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',()=>{
- //倘若有响应,说明数据发送结束,我们已经拿到所有数据
- -variable language_">console.log(str)
- //4.2 利用内置模块的parser()进行数据解析
- const body=qs.parse(str)
- //4.3 进行数据对象的挂载
- req.-property">body=body
- -variable language_">console.log(body)
- })
-
- //2.5 不要忘记需要调用next函数
- next()
- })
-
- //3.1 编写路由对数据进行测试
- app.post('/user',(req,res)=>{
-
- //5.1 拿到上游的挂载数据并显示
- -variable language_">console.log(req.-property">body)
- })
-
- app.listen(8080,()=>{
- -variable language_">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',()=>{
- //倘若有响应,说明数据发送结束,我们已经拿到所有数据
- -variable language_">console.log(str)
- //4.2 利用内置模块的parser()进行数据解析
- const body=qs.parse(str)
- //4.3 进行数据对象的挂载
- req.-property">body=body
- -variable language_">console.log(body)
- })
-
- //2.5 不要忘记需要调用next函数
- next()
- }
-
- //1.4 通过module.exports暴露
- -variable language_">module.-property">exports=myparse
我们自定义一个模块,将中间件函数放到模块里,别忘了导入内置模块querystring;然后通过module.exports将函数暴露出去,然后在服务器上导入自定义模块并挂在成全局中间件即可;
-
- //2.1 导入自定义解析模块
- const -variable constant_">myparse=require('./mybody-parse')
-
- //1.1 创建自己的中间件函数并且挂载
- app.use(myparse)
通过postman发送数据可以看到结果是一样的;
好了,自定义模块就这些,你们会了吗?
关注我,更多分享
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!