设为首页 加入收藏

TOP

可能是全网最详细的express--middleware(一)
2019-09-17 18:59:26 】 浏览:43
Tags:可能 全网 详细 express--middleware

写在前面

hello,小伙伴们,我是你们的pubdreamcc,本篇博文出至于我的GitHub仓库node学习教程资料,欢迎小伙伴们点赞和star,你们的点赞是我持续更新的动力。

GitHub仓库地址:node学习教程

好了,废话不多说了,今天继续我们express的学习~

开篇

今天我们来聊一聊express中非常重要的一个概念——express middleware (express中间件)。中间件实质就是一个函数,我们从发送一个请求到最后服务端给回响应,在这个过程中请求会经过多个中间件处理。下面给出一张图来理解express中间件的概念:

这个是我们平常自来水的处理过程图,可以看到我们自来水从水库取出来到最后进入每个家庭,中间经过了多次的处理,我们可以理解为中间的每一个处理过程(方法)称之为中间件。expressmiddleware类似于上图中的每一个处理过程,我们请求到响应之间也是经过了一个或多个中间件处理,最后才是我们看到的响应结果。

中间件的分类和使用

这里我们可以看下express官网对中间件的分类介绍。

express-middleware

  1. Application-level middleware(应用程序级别中间件)

应用程序级别中间件又分为以下三种情况。

  • 不管请求地址和请求方法,任何请求都能进入。
const app = express()

app.use((req, res, next) => {
  console.log('请求来了1~')
  next()  // 调用next(),请求会去下一个紧挨着的匹配的中间件
})

app.use((req, res, next) => {
  console.log('请求来了2~')
   // 没有调用next(),请求会留在该中间件中
})

app.use((req, res, next) => {
  console.log('请求来了3~')
})

这里配置了三个应用程序级别的中间件,当客户端发一个请求,就会从上至下首先进入第一个中间件处理,接着看是否内部调用next()来决定请求是否往下执行。

我们在服务端请求处理函数中还可以传入第三个参数:next,如果在函数体中调用next(),则请求会在经过该中间件处理后继续向下找最近的那个匹配成功的中间件,并且进入该中间件处理。如果没有调用next(),则请求会留在该中间件中,不会继续往下执行。

结果:

// 请求来了1

// 请求来了2
  • 特定请求路径的任何类型请求都能进入
const app = express()

app.use('/a', (req, res, next) => {
  console.log('请求来了1~')
  next()  // 调用next(),请求会去下一个紧挨着的匹配的中间件
})

app.use('/b', (req, res, next) => {
  console.log('请求来了2~')
})

app.use('/a', (req, res, next) => {
  console.log('请求来了3~')
})

同样的,这里也配置了三个中间件,因为在中间件中规定了请求路径,所以只能是以 /a 开头 的请求才能进入第一个中间件处理。因为在第一个中间件内部调用了next()方法,所以请求会继续往下找匹配的中间件,第二个中间请求地址不匹配,所以进入第三个中间件处理。

结果:

// 请求来了1

// 请求来了3
  • 特定请求方法和特定请求地址的请求能够进入

对于这种情况我们最为熟悉,之前已经练习过多次。

const app = express()

app.get('/a', (req, res, next) => {
  console.log('请求来了1~')
  next()  // 调用next(),请求会去下一个紧挨着的匹配的中间件
})

app.post('/a', (req, res, next) => {
  console.log('请求来了2~')
})

app.get('/a', (req, res, next) => {
  console.log('请求来了3~')
})

同样以上面的例子,写三个中间件。这里规定了必须以 GET 请求而且请求路径为:/a的请求会被第一个中间件处理,因为内部调用了 next(),所以请求会继续往下找临近的匹配的中间件,第二个中间件规定的请求方法为:POST,所以进入第三个中间件处理。

结果:

// 请求来了1

// 请求来了3
  1. Router-level middleware(路由级别中间件)

路由级别的中间件与上面应用程序级别中间件的工作方式类似,只不过把路由模块单独提取出来,最后通过把路由容器挂载到 app 服务器实例上即可。

  • 不管请求地址和请求方法,任何请求都能进入。
const router = express.Router()

router.use((req, res, next) => {
  console.log('请求来了1~')
  next() // 调用next(),请求会去下一个紧挨着的匹配的中间件
})

router.use((req, res, next) => {
  console.log('请求来了2~')
  // 没有调用next(),请求停留在此,不会继续往下找了
})

router.use((req, res, next) => {
  console.log('请求来了3~')
})

结果:

// 请求来了1~

// 请求来了2~
  • 特定请求路径的任何类型请求都能进入
const router = express.Router()

router.use('/a', (req, res, next) => {
  console.log('请求来了1~')
  next()  // 调用next(),请求会去下一个紧挨着的匹配的中间件
})

router.use('/b', (req, res, next) => {
  console.log('请求来了2~')
})

router.use('/a', (req, res, next) => {
  console.log('请求来了3~')
})

结果:

// 请求来了1~

// 请求来了3~
  • 特定请求方法和特定请求地址的请求能够进入
const router = express.Router()

router.get('/a', (req, res, next) => {
  console.log('请求来了1~')
  next()  // 调用next(),请求会去下一个紧挨着的匹配的中间件
})

router.post('/a', (req, res, next) => {
  console.log('请求来了2~')
})

router.get('/a', (req, res, next) => {
  console.log('请求来了3~')
})

结果:

// 请求来了1~

// 请求来了3~
  1. Error-handling middleware(全局错误处理中间件)

在实际开发中,往往我们需要统一来处理异步操作发生的错误,这个时候我们需要在项目中配置一个全局错误处理中间件即可。

const express = require('express')
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇mvvm实现一个简单的vue 下一篇快速上手 Echarts

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目