ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

编写一个简单的中间件

2021-10-10 21:02:44  阅读:124  来源: 互联网

标签:body express app req 中间件 str 简单 编写


相信使用过Node.js的小伙伴一定对中间件不陌生吧,中间件的出现,无一例外是为了提高我们的写代码效率而诞生的,但是很多小伙伴都用过Express中间件,但是并没有自己动手写一个属于自己的中间件,今天我就带大家写一个简单的中间件

1.中间件的概念

1.1 所谓的中间件(Middleware ),特指业务流程中间的处理环节

2.2 现实生活中的例子

在生活中我们所使用过后的污水要经过处理后才可以排放,而中间的处理步骤正是中间件所存在的意义,而中间件也是这样,经过过滤之后把所需要的数据别传到用户和后台. 

生活中的实例.png

2.Express调用流程

2.1 当客户端的数据传入到Express服务器后经过一个又一个的中间件进行预处理后在响应给客户端

Snipaste_2021-10-09_20-33-57.png

3.next的作用

next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件路由

中间件作用1.png

4 自定义中间件(定义一个自己的中间件)

1.需求: 模拟一个类似于express.urlencoded的中间件,解析post提交到服务器的数据

2.实现步骤:

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

3.定义一个中间件

app.use(function(req,rqs,next){
    //中间件的业务逻辑
})
  1. 监听 req 的 data 事件

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

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

//定义变量,用来存储客户端发过来的请求数据
let str=''
//监听req对象的data 时间(客户端发送过来的请求体数据)
req.on('data',(chunk)=>{
str+=chunk
})
  1. 监听 req 的 end 事件

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

我们可以在 req 的 end 事件中,拿到并处理完整的请求体数据

//监听req对象的end事件 (请求体发送完毕后自动触发)
req.on('end' , ()=>{
//打印完整的请求体数据
console.log(str)
//TODO: 把字符串格式请求体数据,解析成为对象格式
})
  1. 用 querystring 模块解析请求体数据

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

  3. 代码如下

//导入处理querystring的Node.js内置模块
const qs = require('querystring')

//调用qs.parse()方法,把查询字符串解析为对象
const body = qs.parse(str)

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

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

 req.on('end', () => {
  // 在 str 中存放的是完整的请求体数据
  // console.log(str)
  // TODO: 把字符串格式的请求体数据,解析成对象格式
  const body = qs.parse(str)
  req.body = body
  next()
})
  1. 将自定义中间件封装为模块

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

9.完整代码

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// 导入 Node.js 内置的 querystring 模块
const qs = require('querystring')

// 这是解析表单数据的中间件
app.use((req, res, next) => {
// 定义中间件具体的业务逻辑
// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
let str = ''
// 2. 监听 req 的 data 事件
req.on('data', (chunk) => {
  str += chunk
})
// 3. 监听 req 的 end 事件
req.on('end', () => {
  // 在 str 中存放的是完整的请求体数据
  // console.log(str)
  // TODO: 把字符串格式的请求体数据,解析成对象格式
  const body = qs.parse(str)
  req.body = body
  next()
})
})

app.post('/user', (req, res) => {
res.send(req.body)
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
console.log('Express server running at http://127.0.0.1')
})

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 1. 导入自己封装的中间件模块
const customBodyParser = require('./14.custom-body-parser')
// 2. 将自定义的中间件函数,注册为全局可用的中间件
app.use(customBodyParser)

app.post('/user', (req, res) => {
res.send(req.body)
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
console.log('Express server running at http://127.0.0.1')
})

标签:body,express,app,req,中间件,str,简单,编写
来源: https://blog.csdn.net/m0_62690153/article/details/120692048

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有