自定义一个中间件

本文介绍了如何自定义一个中间件,以模拟类似express.urlencoded的功能,解析POST提交的表单数据。通过监听HTTP请求的事件,使用特定模块解析请求体,并将解析结果挂载到请求对象上。同时,文章还展示了如何将自定义中间件封装为模块,以便在其他项目中复用。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



前言

所谓中间件(Middleware),就是特指业务流程的中间处理环境。举个例子:生活中处理污水的中间环节就可以理解为中间件。


 

 

提示:以下是本篇文章正文内容,下面案例可供参考


一、自定义中间件的步骤:

1.需求描述:手动模拟一个类似于express.urlencoded这样的中间件,来解析POST提交到服务器的表单数据 

 2.实现步骤:

  • 定义中间件

  • 监听 reqdata 事件

  • 监听 reqend 事件

  • 使用 querystring 模块解析请求体数据

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

  • 将自定义中间件封装为模块

//index.js

//1.导入express模块
const express = require('express')
//2.实例化express对象
const app = express()
//9.导入Node内置模块 querystring
const qs = require('querystring')

//5.定义中间件
app.use((req,res,next)=>{
    //6.定义一个str空字符串来接收客户端发送过来的请求体数据
    let str = ''
    //7.注册监听req的data事件
    req.on('data',(chunk)=>{
        str += chunk
    })
    //8.注册监听req的end事件
    req.on('end',()=>{
        //将字符串格式的请求体数据,解析成对象
        //调用 qs.parse() 方法,将查询字符串解析成对象
        const body = qs.parse(str)
        //将解析出来的数据对象挂载为 req.body 属性
        req.body = body
        next()
    })
})


//4.提交psot请求
app.post('/user',(req,res) =>{
       res.send(req.body)
})

//3.调用app.listen方法.指定端口号并启动web服务器
app.listen(3000,()=>{
    console.log('http:127.0.0.1:3000')
})

3.将自定义中间件封装为模块(优化代码)

// custom-body-parser.js

//9.导入Node内置模块 querystring
const qs = require('querystring')

const bodyParser = (req,res,next)=>{
    //6.定义一个str空字符串来接收客户端发送过来的请求体数据
    let str = ''
    //7.注册监听req的data事件
    req.on('data',(chunk)=>{
        str += chunk
    })
    //8.注册监听req的end事件
    req.on('end',()=>{
        //将字符串格式的请求体数据,解析成对象
        //调用 qs.parse() 方法,将查询字符串解析成对象
        const body = qs.parse(str)
        //将解析出来的数据对象挂载为 req.body 属性
        req.body = body
        next()
    })
}

//向外提供模块里面的内容
module.export = bodyParser

4.在index.js中导入自己定义的中间件模块 

//index.js

//1.导入express模块
const express = require('express')
//2.实例化express对象
const app = express()
//导入自己定义的中间件模块
const mybody = require('./index')


//5.定义中间件
app.use(mybody)


//4.提交psot请求
app.post('/user',(req,res) =>{
       res.send(req.body)
})

//3.调用app.listen方法.指定端口号并启动web服务器
app.listen(3000,()=>{
    console.log('http:127.0.0.1:3000')
})


 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值