1. 中间件的概念
1.1 什么是中间件
中间件(Middleware ),特指业务流程的中间处理环节.
1.2 Express中的 中间件
当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
1.3 中间件的格式
Express 的中间件,本质上就是一个 function 处理函数,Express 中间件的格式如下:
中间件函数的形参列表中,必须包含 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 使用注意事项
- 一定要在路由之前注册中间件
- 客户端发送过来的请求,可以连续调用多个中间件进行处理
- 执行完中间件的业务代码之后,不要忘记调用 next() 函数
- 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
- 连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象
3. 中间件的分类
为了方便大家理解和记忆中间件的使用,Express 官方把常见的中间件用法,分成了 5 大类,分别是:
- 应用级别的中间件
- 路由级别的中间件
- 错误级别的中间件
- Express 内置的中间件
- 第三方的中间件
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 项目的开发效率和体验:
express.static
快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(服务器托管网无兼容性)express.json
解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)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
这个第三方中间件,来解析请求体数据。
- 运行 npm install body-parser 安装中间件
- 使用 require 导入中间件
- 调用 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 这个第三方中间件进一步封装出来的。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net