自定义一个中间件

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



前言

所谓中间件(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')
})


 


### 自定义简单中间件类的实现方法 #### ASP.NET Core 中的自定义中间件 在 ASP.NET Core 中,可以通过创建一个类并实现 `Invoke` 或 `InvokeAsync` 方法来构建自定义中间件。这个方法接收当前的 HTTP 上下文,并允许开发者在其内部编写求/响应处理逻辑[^3]。 以下是基于 .NET 的自定义中间件实现示例: ```csharp public class CustomMiddleware { private readonly RequestDelegate _next; public CustomMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 求前的操作 Console.WriteLine("Request is being processed."); await _next(context); // 调用下一个中间件 // 响应前的操作 Console.WriteLine("Response has been sent."); } } ``` 为了注册该中间件,可以在应用程序启动配置中调用扩展方法将其添加到管道中: ```csharp public static IApplicationBuilder UseCustomMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<CustomMiddleware>(); } // 注册中间件 app.UseCustomMiddleware(); ``` 上述代码展示了如何通过继承 `RequestDelegate` 并利用异步编程模型完成求和响应的拦截与增强功能。 --- #### Django 中的自定义中间件 对于 Python 开发者而言,在 Django 框架中也可以轻松实现类似的中间件机制。Django 提供了一种灵活的方式用于修改输入求或输出响应的行为[^4]。 下面是 Django 自定义中间件一个基本实例: ```python class CustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 处理求之前的逻辑 print("Before processing the request.") response = self.get_response(request) # 返回响应之前的逻辑 print("After sending the response.") return response ``` 要激活此中间件确保将其路径添加至项目的设置文件中的 `MIDDLEWARE` 列表里: ```python MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'path.to.CustomMiddleware', # 添加自定义中间件的位置 ... ] ``` 以上代码片段说明了如何通过重载 `__init__()` 和 `__call__()` 方法来自定义求和响应流程。 --- #### 总结 无论是 ASP.NET Core 还是 Django,它们都提供了强大的工具支持开发人员快速搭建自己的业务逻辑层——即所谓的“中间件”。这种设计模式不仅提高了程序结构清晰度,还增强了系统的可维护性和灵活性[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值