• 【Node.js】中间件


    目录

    什么是中间件 

    定义中间件函数

    最简单的中间件函数 

    全局生效的中间件

    定义多个全局中间件

    局部生效的中间件

    中间件的分类

    应用级别的中间件

    路由级别的中间件

    错误级别的中间件

    Express内置的中间件

    第三方的中间件


    什么是中间件 

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

    Express中间件的调用流程

    当一个请求处理时,可以连续调用多个中间件,从而对这次请求进行预处理

    Express中间件的格式

    本质上就是一个function处理函数,下图为官网的介绍

    中间件函数的形参列表中,必须包含next参数,而路由处理函数中只包含req和res

    定义中间件函数

    最简单的中间件函数 

    1. //常量mw所指向的,就是一个中间件函数
    2. const mw = function(req,res,next){
    3. console.log('这是一个简单的中间件函数')
    4. //注意:在当前中间件的业务处理完毕后,必须调用next()函数
    5. //表示把流转关系转交给下一个中间件或路由
    6. next()
    7. }

    全局生效的中间件

    客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件

    调用app.use(中间件函数),即可定义一个全局生效的中间件,实例代码

    1. //常量mw所指向的,就是一个中间件函数
    2. const mw = function(req,res,next){
    3. console.log('这是一个简单的中间件函数')
    4. next()
    5. }
    6. //全局生效的中间件
    7. app.use(mw)

    中间件的作用

    多个中间件之间,共享同一份reqres,基于这样的特性,我们可以在上游的中间件,统一为req和res对象添加自定义属性或方法,供下游的中间件或路由进行使用

    1. app.use((req,res,next)=>{
    2. //获取到请求到达服务器的时间
    3. const time = Date.now()
    4. //为req对象,瓜子自定义属性,从而把时间共享给后面的所有路由
    5. req.startTime = time
    6. next()
    7. })
    8. app.get('/',(req,res)=>{
    9. res.send('Home page' + req.startTime)
    10. })
    11. app.get('/user',(req,res)=>{
    12. res.send('User page' + req.startTime)
    13. })

    定义多个全局中间件

    使用app.use()连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次调用。

    1. app.use((req,res,next)=>{
    2. console.log('这是第一个全局中间件')
    3. next()
    4. })
    5. app.use((req,res,next)=>{
    6. console.log('这是第二个全局中间件')
    7. next()
    8. })
    9. app.use((req,res,next)=>{
    10. console.log('这是第三个全局中间件')
    11. next()
    12. })

    局部生效的中间件

    不使用app.use()定义的中间件,叫做局部生效的中间件

    1. const mw = function(req,res,next){
    2. console.log('这是一个中间件')
    3. next()
    4. }
    5. //mw这个中间件只在当前路由中生效,叫做局部生效的中间件
    6. app.get('/',mw,function(req,res){
    7. res.send('Home page')
    8. })
    9. //mw这个中间件不会影响下面这个路由
    10. app.get('/user',function(req,res){
    11. res.send('User page')
    12. })

    定义多个局部中间件:下面两种写法完全等价,可以使用多个局部中间件

    1. app.get('/',mw1,mw2,function(req,res){
    2. res.send('Home page')
    3. })
    4. app.get('/',[mw1,mw2],function(req,res){
    5. res.send('Home page')
    6. })

    中间件的注意事项:

    1. 一定要在路由之前注册中间件
    2. 客户端发送过来的请求,可以连续调用多个中间件进行处理
    3. 执行完中间件的业务代码之后,不要忘记调用next()函数
    4. 为了防止代码逻辑混乱,调用next()函数后不要再写额外的代码
    5. 连续调用多个中间件时,多个中间件之间,共享req和res对象

    中间件的分类

    1. 应用级别的中间件
    2. 路由级别的中间件
    3. 错误级别的中间件
    4. Express内置的中间件
    5. 第三方的中间件

    应用级别的中间件

    通过app.use()app.get()app.post(),绑定到app实例上的中间件,叫做应用级别的中间件。

    1. app.use((req,res,next)=>{
    2. console.log('这是第一个全局中间件')
    3. next()
    4. })
    5. app.use((req,res,next)=>{
    6. console.log('这是第二个全局中间件')
    7. next()
    8. })
    9. app.use((req,res,next)=>{
    10. console.log('这是第三个全局中间件')
    11. next()
    12. })

    路由级别的中间件

    绑定到express.Router()实例上的中间件,叫做路由级别的中间件。

    1. var app=express()
    2. var router = express.Router()
    3. //路由级别的中间件
    4. router.use(function(req,res,next){
    5. console.log('Time:',Date.now())
    6. next()
    7. })
    8. app.use('/',router)

    错误级别的中间件

    作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题。

    格式:错误级别中间件的function处理函数,必须有四个形参,(err,req,res,next)

    1. app.get('/',function(req,res){
    2. throw new Error('服务器内部发生错误')
    3. res.send('Home page')
    4. })
    5. app.use(function(err,req,res,next){ //错误级别的中间件
    6. console.log('发生了错误',+err.message) //在服务器打印错误消息
    7. res.send('Error!' + err.message) //在客户端响应错误相关的内容
    8. })

    错误级别的中间件必须注册在所有路由之后

    Express内置的中间件

    express.static 快速托管静态资源的内置中间件

    express.json 解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本可用)

    express.urlencoded 解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本可用)

    1. //配置解析 application/json格式数据的内置中间件
    2. app.use(express.json())
    3. //配置解析 application/x-www-form-urlencoded 格式数据的内置中间件
    4. app.use(express.urlencoded({ extended:false }))

    第三方的中间件

    按需下载并配置第三方中间件,从而提高项目的开发效率

    在express@4.16.0之前的版本中,经常使用body-parser这个第三方中间件,来解析请求体数据

    1. 运行npm install body-parser 安装中间件
    2. 使用require导入中间件
    3. 调用app.use()注册并使用中间件

  • 相关阅读:
    力扣(LeetCode)177. 第N高的薪水(2022.06.26)
    【尚庭公寓SpringBoot + Vue 项目实战】移动端项目初始化(十九)
    Vuex存值取值与异步请求处理
    【数据结构(二)】稀疏 sparsearray 数组(1)
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    【力扣-数据结构和算法-头哨兵】移除链表元素
    JAVA技能树-打卡
    探索dbus-sensors: 从传感器读取到xyz.openbmc_project.Sensor接口的细致解析
    PAT甲级 1066 Root of AVL Tree
    双目视觉实战--相机几何
  • 原文地址:https://blog.csdn.net/qiaoyangla/article/details/126216488