一文大白话讲清楚Node中间件
文章目录
- 一文大白话讲清楚Node中间件
- 1. 先讲故事
- 2.中间件
- 3. 怎么用
- 4. 快速中间件
- 5. 中间件的分类
- 5.1 应用级中间件
- 5.2 路由级中间件
- 5.3 内置中间件
- 5.4 处理错误中间件
- 5.5 第三方中间件
- 6. 简单实现一个中间件
一文大白话讲清楚Node中间件
1. 先讲故事
-
我们前端开发,避免不了和服务器进行数据交互,发送网络请求
-
但有些情况下,客户端发送的请求可能数据格式Request不一定符合服务器的要求,我们希望在服务器处理数据之前,能有一个东西对Request数据格式进行一下判断和处理
-
或者服务器在发送Response的之前,希望添加一些响应头的设置,我们也希望有这么一个东西能协助
-
于是就这样的模式
-
中间这个东西,就是所谓的中间件
2.中间件
- 通过上面的介绍我们大概了解了什么事中间件
- 他的本质可以理解为一个函数
- 客户端的Request先到到达中间件,处理完成后,交给实际业务逻辑
- 业务逻辑处理完后,把Response交给中间件,处理完成后,发送给客户端
- 当然,中间件可以是多个,这个处理完交给下一个,交的方式就是通过next指定,直到所有的中间件全部执行完。很多人管这个叫洋葱模型,其实别洋葱大蒜了,要重要的是你要明白实心的原理
3. 怎么用
- 因为中间件就是一个函数,针对node不同的框架中间件的使用方式大同小异,主要是参数的差别
- koa框架中,中间件接受两个参数,ctx和next
- ctx里面封装了Request和Response变量
- next就是下一个中间件
- 而在express框架中,直接接受三个参数,request,response和next,相当于把ctx解耦了
- 我们以express举例,
- 如果用户登录了,我们拿到用户的ID,再读取用户的详细信息封装在response里面,返回给客户端
// 这里假设已经登陆成功了,也就是response里面已经有ID了
const app=express()
function middleware(request,response,next){
/*
* 根据ID读取封装用户信息
* */
next()
}
app.use(middleware)
- 中间件大概有以下的用途
- 在网络中的系统之间进行实时数据访问
- 在请求对象到达服务器之前访问请求对象,做进一步处理
- 用于身份验证和日志记录
- 用于指定HTTP标头
- 优化和提高性能
4. 快速中间件
- 快速中间件可以理解为各框架内置的中间件
- 比如在Express中,我们常用的body-parse,负责解析HTTP请求正文
- 再比如cookie-parse,负责解析cookie标头,并填充request.cookies
5. 中间件的分类
5.1 应用级中间件
- 应用级中间件常备用来做身份验证
5.2 路由级中间件
- 路由级中间件可以通过路由器灯方法实现,比兔router。use(),工作方式和应用及中间件一样
5.3 内置中间件
- 不依赖connect方法,常用的有static,静态资产函数;json,添加JSOn有效负载类计算传入请求
5.4 处理错误中间件
- 专门用来处理错误的中间件
5.5 第三方中间件
- 我们可以通过npm暗账第三方中间件
6. 简单实现一个中间件
- 基于express实现,请先配置express项目环境(创建项目目录,然后nem init 初始化,再然后用npm install express命令安装express )。
- 我们大概要实现的是,接收来自8088端口的请求,然后返回数据,在返回数据前,插入中间件做一些事情
- 我们创建一个node.js,里面监听8088端口的请求
const express=require("express")
const app=express()
app.get("/",(request,response)=>{
response.send(`<div>Listen 8088 Result</div>`)
})
app.listen(8088,()=>{
console.log("Listening 8088 ")
})
- 然后node node.js运行,会发现首先控制台打印了Listening 8088,说明我们已经在监听8088了
- 然后咱浏览器输入localhost:8088回车,就看到了response出来的东西
/20230724024159.png?origin_url=img_6.png&pos_id=img-eaPnjTf6-1737011095573) - 这时候我们在response。send之前加一个中间件,我们希望在中间件里面答应request和response信息,并打印正在执行中间件
const express=require("express")
const app=express()
//定义中间件
function middleware(req,res,next){
console.log(req,res)
console.log('executing middleware')
next()
}
app.get("/",middleware/*中间件*/,(request,response)=>{
response.send(`<div>Listen 8088 Result</div>`)
})
app.listen(8088,()=>{
console.log("Listening 8088 ")
})
- 会发现当我们咱浏览器输入localhost:8088回车,就看到了除了response出来的东西,控制台还打印了request信息,response信息和executing middleware
- 这就说明中间件起作用了