0
点赞
收藏
分享

微信扫一扫

Express 的中间件

1. 中间件的概念

1.1 什么是中间件

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

Express 的中间件_中间件

1.2 Express中的 中间件

当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理

1.3 中间件的格式

Express 的中间件,本质上就是一个 function 处理函数,Express 中间件的格式如下:

Express 的中间件_Express_02

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

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

2. 中间件使用

2.1 定义中间件函数

const mw = (req, res, next)=>{
    console.log('这是一个中间件函数!');
    // 中间件业务处理完毕后,必须调用 next 函数, 表示将流转关系交给下一个中间件或者路由
    next();
}

2.2 全局生效的中间件

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

const mw = (req, res, next)=>{
    console.log('这是一个中间件函数!');
    next();
}
// 通过调用 app.use(中间件函数),即可使用一个全局生效的中间件
app.use(mw);

//
// 换种写法
app.use((req, res, next)=>{
    console.log('中间件函数');
    next();
})

2.2.1 定义多个全局中间件

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

////
app.use((req, res, next)=>{
    console.log('这是第一个中间件');
    next();
})

app.use((req, res, next)=>{
    console.log('这是第二个中间件');
    next();
})

app.get('/',(req,res)=>{

    // 请求这个路由时, 会依次触发上述两个全局中间件
    res.send('主页')
})

2.3 中间件的作用

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

2.4 局部生效的中间件

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

////
const mw = (req, res, next)=>{
    console.log('这是中间件函数');
    next();
}

// mw 此时只在 '/list' 这个路由中生效
app.get('/list', mw, (req, res)=>{
    res.send('电影列表信息!!')
})

// 不影响下边的路由
app.get('/user',(req, res)=>{
    res.send('用户页面')
})

使用多个局部生效的中间件

//// 形式一
app.use('/', mw1, mw2, (req, res)=>{
    console.log('主页')
})

// 形式二
app.use('/',[mw1, mw2], (req, res)=>{
    console.log('主页')
})

2.5 使用注意事项


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

3. 中间件的分类

为了方便大家理解和记忆中间件的使用,Express 官方把常见的中间件用法,分成了 5 大类,分别是:

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

3.1 应用级别的中间件

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

//// 应用级别的中间件(全局中间件)
app.use((req, res, next)=>{
    next();
})

// 应用级别的中间件(局部中间件)
app.get('/', mw, (req, res)=>{
    res.send('主页')
})

3.2 路由级别的中间件

绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别。只不过,应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上

const app = express();

const router = express.Router();

// 路由级别的中间件

router.use((req, res, next)=>{
    console.log('hello bf!!');
    next();
})

//挂载路由
app.use('/', router);

3.3 错误级别的中间件

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

格式:错误级别中间件的 function 处理函数中,必须有 4 个形参,形参顺序从前到后,分别是 (err, req, res, next)。

//
// 定义路由, 抛出一个错误
app.get('/',(req, res)=>{
    throw new Error('服务器内部发生了错误!');
    res.send('主页')
})

// 设置错误级别的中间件, 捕获错误
// 注意: 必须注册在所有路由之后
app.use((err, req, res, next)=>{
    console.log('发生了错误', err.message);
    res.send('Error! ',err.message)
})

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

3.4 内置的中间件

自 Express 4.16.0 版本开始,Express 内置了 3 个常用的中间件,极大的提高了 Express 项目的开发效率和体验:

  1. express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性)
  2. express.json 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
  3. express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

// 配置解析 application/json 格式数据的 内置中间件
app.use(express.json())

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

3.5 第三方的中间件

非 Express 官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。

在项目中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。例如:在 express@4.16.0 之前的版本中,经常使用 body-parser 这个第三方中间件,来解析请求体数据。


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

const bodyParser = require('body-parser');
//配置解析 application/x-www-form-urlencoded 格式数据
app.use(bodyParser.urlencoded({ extended: false }));
// 配置解析 application/json 格式数据
app.use(bodyParser.json())

Express 内置的 express.urlencoded 中间件,就是基于 body-parser 这个第三方中间件进一步封装出来的。

举报

相关推荐

0 条评论