自定义一个中间件(功能:解析POST提交到服务器的表单数据)

类似于express.urlencoded

实现过程(6步):

定义中间件——>监听req(客户端请求的请求体)的data事件——>监听req.end事件(表示数据已经发送完毕——>使用node内置的querystring模块解析请求体数据——>将解析出来的数据对象挂载为req.body——>将自定义中间件进行封装


监听req(客户端请求的请求体)的data事件 

req.date是客户端发送给服务器的数据,如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后,分批发送到服务器,所以data事件可能会触发多次,每一次触发data事件,获取到的数据只是完整数据的一部分,需要对收到的数据进行拼接,将所有数据拼接完成后才是最终发送的数据——————req.on方法监听data事件,触发data事件表示客户端向服务器发送请求体数据,chunk表示完整数据的一部分---对一开始的空数据进行拼接


//这是解析表单数据的中间件
app.use(function(req,res,next){
let str=''
    //监听req.data——>保存了客户端发送给服务器的数据
    req.on('date',function(chunk){
        str+=chunk
    })
})

监听req.end事件(表示数据已经发送完毕)

-------当数据接收完毕会自动触发req的end事件,可以使用req.on拿到end事件,并处理完整的请求体数据——之后就是将字符串格式的数据解析成对象格式 on方法

    req.on('end',function(){
        console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式
    })
const express=require('express')
const querystring=require('node:querystring')//由于querystring被弃用了

//创建服务器
const app=express()

//这是解析表单数据的中间件
app.use(function(req,res,next){
let str=''
    //监听req.data——>保存了客户端发送给服务器的数据
    req.on('data',function(chunk){
        str+=chunk
    })
    req.on('end',function(){
        console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
   next()
    })

   
})
//路由--测试
app.post('/user',(req,res)=>{
    res.send('wwok')
})

app.listen(80,()=>{
    console.log('服务器启动成功 127.0.0.1')
})

 


使用node内置的querystring模块解析请求体数据

 querystring,专门用来处理查询字符串,通过这个模块提供的parse()函数,可以把查询的字符串,解析成对象的格式 (把查询的字符串作为传入的参数——导入模块)

const qs=require('querystring')
 const body=qs.parse(str)
        console.log(body)

 由于querystring被弃用了

const querystring=require('node:querystring')//由于querystring被弃用了
const express=require('express')
const querystring=require('node:querystring')//由于querystring被弃用了

//创建服务器
const app=express()

//这是解析表单数据的中间件
app.use(function(req,res,next){
let str=''
    //监听req.data——>保存了客户端发送给服务器的数据
    req.on('data',function(chunk){
        str+=chunk
    })
    req.on('end',function(){
        console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
        const body=querystring.parse(str)
        console.log(body)
   next()

    })

 、
})
//路由--测试
app.post('/user',(req,res)=>{
    res.send('wwok')
})

app.listen(80,()=>{
    console.log('服务器启动成功 127.0.0.1')
})


将解析出来的数据对象挂载为req.body

 上游的中间件和下游的中间件和路由之间共享一份req,res。所以我们可以将解析出来的数据,挂载为req的自定义属性,命名req.body,提供给下游使用  req.body=body;//进行挂载

const express=require('express')
const querystring=require('node:querystring')//由于querystring被弃用了

//创建服务器
const app=express()

//这是解析表单数据的中间件
app.use(function(req,res,next){
let str=''
    //监听req.data——>保存了客户端发送给服务器的数据
    req.on('data',function(chunk){
        str+=chunk
    })
    req.on('end',function(){
       // console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
        const body=querystring.parse(str)
        console.log(body)
        req.body=body;//进行挂载
        next()//跳转去下一个中间件或者路由
    })
})
//路由--测试
app.post('/user',(req,res)=>{
    res.send(req.body)
})

app.listen(80,()=>{
    console.log('服务器启动成功 127.0.0.1')
})

将自定义中间件进行封装

封装:


const querystring=require('node:querystring')//由于querystring被弃用了

//创建服务器

//这是解析表单数据的中间件
const bodyParser=function(req,res,next){

    let str=''
    //监听req.data——>保存了客户端发送给服务器的数据
    req.on('data',function(chunk){
        str+=chunk
    })
    req.on('end',function(){
        console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
        const body=querystring.parse(str)
        console.log(body)
        req.body=body;//进行挂载
        next()
    })

}

module.exports=  bodyParser

 导出:

const express=require('express')
const a=require('./自定义中间件封装')

//创建服务器
const app=express()

//将自定义的中间件注册为全局可用的中间件
app.use(a)
//路由--测试
app.post('/user',(req,res)=>{
   
    res.send(req.body)
})

app.listen(80,()=>{
    console.log('服务器启动成功 127.0.0.1')
})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值