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


    类似于express.urlencoded

    实现过程(6步):

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


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

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

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

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

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

    1. req.on('end',function(){
    2. console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式
    3. })
    1. const express=require('express')
    2. const querystring=require('node:querystring')//由于querystring被弃用了
    3. //创建服务器
    4. const app=express()
    5. //这是解析表单数据的中间件
    6. app.use(function(req,res,next){
    7. let str=''
    8. //监听req.data——>保存了客户端发送给服务器的数据
    9. req.on('data',function(chunk){
    10. str+=chunk
    11. })
    12. req.on('end',function(){
    13. console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
    14. next()
    15. })
    16. })
    17. //路由--测试
    18. app.post('/user',(req,res)=>{
    19. res.send('wwok')
    20. })
    21. app.listen(80,()=>{
    22. console.log('服务器启动成功 127.0.0.1')
    23. })

     


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

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

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

     由于querystring被弃用了

    const querystring=require('node:querystring')//由于querystring被弃用了
    
    1. const express=require('express')
    2. const querystring=require('node:querystring')//由于querystring被弃用了
    3. //创建服务器
    4. const app=express()
    5. //这是解析表单数据的中间件
    6. app.use(function(req,res,next){
    7. let str=''
    8. //监听req.data——>保存了客户端发送给服务器的数据
    9. req.on('data',function(chunk){
    10. str+=chunk
    11. })
    12. req.on('end',function(){
    13. console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
    14. const body=querystring.parse(str)
    15. console.log(body)
    16. next()
    17. })
    18. })
    19. //路由--测试
    20. app.post('/user',(req,res)=>{
    21. res.send('wwok')
    22. })
    23. app.listen(80,()=>{
    24. console.log('服务器启动成功 127.0.0.1')
    25. })


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

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

    1. const express=require('express')
    2. const querystring=require('node:querystring')//由于querystring被弃用了
    3. //创建服务器
    4. const app=express()
    5. //这是解析表单数据的中间件
    6. app.use(function(req,res,next){
    7. let str=''
    8. //监听req.data——>保存了客户端发送给服务器的数据
    9. req.on('data',function(chunk){
    10. str+=chunk
    11. })
    12. req.on('end',function(){
    13. // console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
    14. const body=querystring.parse(str)
    15. console.log(body)
    16. req.body=body;//进行挂载
    17. next()//跳转去下一个中间件或者路由
    18. })
    19. })
    20. //路由--测试
    21. app.post('/user',(req,res)=>{
    22. res.send(req.body)
    23. })
    24. app.listen(80,()=>{
    25. console.log('服务器启动成功 127.0.0.1')
    26. })

    将自定义中间件进行封装

    封装:

    1. const querystring=require('node:querystring')//由于querystring被弃用了
    2. //创建服务器
    3. //这是解析表单数据的中间件
    4. const bodyParser=function(req,res,next){
    5. let str=''
    6. //监听req.data——>保存了客户端发送给服务器的数据
    7. req.on('data',function(chunk){
    8. str+=chunk
    9. })
    10. req.on('end',function(){
    11. console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
    12. const body=querystring.parse(str)
    13. console.log(body)
    14. req.body=body;//进行挂载
    15. next()
    16. })
    17. }
    18. module.exports= bodyParser

     导出:

    1. const express=require('express')
    2. const a=require('./自定义中间件封装')
    3. //创建服务器
    4. const app=express()
    5. //将自定义的中间件注册为全局可用的中间件
    6. app.use(a)
    7. //路由--测试
    8. app.post('/user',(req,res)=>{
    9. res.send(req.body)
    10. })
    11. app.listen(80,()=>{
    12. console.log('服务器启动成功 127.0.0.1')
    13. })

  • 相关阅读:
    Web前端:React对比Vue,哪一个最适合开发人员?
    Spring自动加载数据几种方式执行顺序
    FPGA零基础学习:VGA协议驱动设计
    vue3 vue-router4 No match found for location with path “/home“
    《洛谷深入浅出进阶篇》 P2367语文成绩——差分
    JVM实战:CMS和G1的物理内存归还机制
    C#学习记录——数据流
    laravel+sse实现实时推送
    微信小程序文本横向无缝滚动
    Worthington核糖核酸酶B历史和化学性质说明
  • 原文地址:https://blog.csdn.net/weixin_47295886/article/details/126693630