Nodejs -- Express 自定义中间件并进行封装

news/2024/11/17 1:38:10/

文章目录

    • 自定义中间件
      • 1 需求描述与实现步骤
      • 2 定义中间件
      • 3 监听req的data事件
      • 4 监听req的end事件
      • 5 使用querystring模块解析请求体数据
      • 6 将解析出来的数据对象挂载为req.body
      • 7 自定义中间件
      • 8 最终代码

自定义中间件

1 需求描述与实现步骤

自己手动模拟一个类似于express.urlencoded这样的中间件,来解析POST提交到服务器的表单数据。

  1. 定义中间件
  2. 监听req的data事件
  3. 监听req的end事件
  4. 使用querystring模块解析请求体数据
  5. 将解析出来的数据对象挂载为req.body
  6. 将自定义中间件封装为模块

2 定义中间件

使用app.use()来定义全局生效的中间件,代码如下:

app.use((req, res, next) => {// 中间件的业务逻辑next()
})

3 监听req的data事件

在中间件中,需要监听req对象的data事件,来获取客户端发送到服务器的数据。

如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后,分批发送到服务器。所以dta事件可能会触发多次,每一次触发dta事件时,获取到数据只是完整数据的一部分,需要手动对接收到的数据进行拼接

// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
let str = ''// 2. 监听 req 的data事件
req.on('data', (chunk) => {str += chunk
})

4 监听req的end事件

当请求体数据接收完毕之后,会自动触发req的end事件。

因此,我们可以在req的end事件中,拿到并处理完整的请求体数据。示例代码如下:

// 3. 监听 req 对象的 end 事件
req.on('end', () => {// 在str中存放的就是完整的请求体数据console.log(str)
})

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

Node.js内置了一个querystring模块,专门用来处理查询字符串。通过这个模块提供的parse()函数,可以轻松把查询字符串,解析成对象的格式。示例代码如下:

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

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

上游的中间件和下游的中间件及路由之间,共享同一份req和res。因此,我们可以将解析出来的数据,挂载为req的自定义属性,命茗为req.body, 供下游使用。示例代码如下:

// 3. 监听 req 对象的 end 事件
req.on('end', () => {// 在str中存放的就是完整的请求体数据const body = qs.parse(str)req.body = bodyconsole.log("中间件", req.body)next()
})

7 自定义中间件

为了优化代码的结构,我们可以把自定义的中间件函数,封装为独立的模块,示例代码如下:

//custom-body-parser.js 模块中的代码
const qs = require('querystring')
function bodyParser(req,res,next){/*省略其它代码*/}
module.exports = bodyParser//向外导出解析请求体数据的中间件函数// ------------------分隔线----------------------
//1,导入自定义的中间件模块
const myBodyParser = require('custom-body-parser')
//2,注册自定义的中间件模块
app.use(myBodyParser)

8 最终代码

index.js

// 导入express
const express = require('express')
const bodyParser = require('./custom-body-parser')// 创建web服务器
const app = express()// 解析表单数据的中间件
app.use(bodyParser)app.post('/user', (req, res) => {console.log("路由接口:", req.body)res.send(req.body)
})// 启动服务器
app.listen(80, () => {console.log('express server running at http://127.0.0.1')
})

custom-body-parser.js

const qs = require('querystring')const bodyParser = (req, res, next) => {// 定义具体的业务逻辑// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据let str = ''// 2. 监听 req 的data事件req.on('data', (chunk) => {str += chunk})// 3. 监听 req 对象的 end 事件req.on('end', () => {// 在str中存放的就是完整的请求体数据req.body = qs.parse(str)console.log("中间件", req.body)next()})
}module.exports = bodyParser


http://www.ppmy.cn/news/27.html

相关文章

工业服务被忽视的销售力量:他们的技术人员

目录 1.从销售到服务的普遍 2.从服务到销售的滞后 3.是什么阻碍了售后服务时销售行为的发生 3.如何改善这种状况 1.从销售到服务的普遍 服务销售窗口的提前在工业企业已经是非常普遍的现象,特别是在互联网经济高度发达的今天,销售的触角已经直达消费…

单身福利专场, Python采集某相亲网站美女数据

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 现在,广大年轻人到了一定年纪,一定会引来父母的念叨 不是让相亲就是让结婚的,与其父母念叨,不如自己找一个 到时候问起来,就说再接触呢~~ 今天我们就来用python…

CSS 的快乐:画一个可爱的三只小鸟 Button

做为前端工程师,最大的快乐之一就是可以用 CSS 画出各种有趣的效果。 比如我最近画的一个 Button: 画的过程中确实很开心,这也是我当时选择做前端的很大一部分原因。 今天我们就一起来画下这个可爱的 Button 吧!纯 CSS&#xff…

webscoket学习

webscoket基本使用 WebSocket - Web API 接口参考 | MDN 使用node编写webscoket服务 nodejs-webscoket 在github的地址↓ GitHub - sitegui/nodejs-websocket: A node.js module for websocket server and client ws和socket.io 是wbscket的两个库 仓库地址:l…

【elementUI样式】模态框中的el-select下拉框不跟随页面滚动问题

文章目录1.在el-select标签中设置:popper-append-to-body"false"2.样式穿透(比较普遍的写法)模态框中的el-select下拉框不跟随页面滚动问题在使用elementUI写界面的时候,偶然遇到了如下图所示bug当页面滚动的时候,el-se…

Mybatis:快速搭建Mybatis(2)

快速搭建Mybatis搭建Mybatis目录框架步骤一:创建Maven工程步骤二:创建mybatis的核心配置文件步骤三:创建mapper接口步骤四:创建Mybatis的映射文件步骤四:通过junit测试增删改查功能步骤五:加入logback日志功…

[附源码]Python计算机毕业设计Django大学生考勤管理系统论文

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

网络面试-0x12 UDP和TCP的区别以及应用场景

一、 UDP (user datagram protocol)用户数据报协议 ①: 一种简单的面向数据报的通讯协议,即:应用层传下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层。无论应…