基本概念
中间件的本质就是一个函数,在收到请求和返回相应的过程中做一些我们想做的事情。
Express对中间件的作用的描述如下:
- 执行任何代码
- 修改请求和响应对象
- 终结请求-响应循环
- 调用堆栈中的下一个中间件
中间件可分为以下五类(原理相同,只是用法不同):
- 应用级中间件
- 路由级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
应用级中间件
应用级中间键绑定到 app 对象,使用 app.use 和 app.method (需要处理 http 请求的方法,例如get、put、post)。
1 | var app = express() |
路由级中间件
路由级中间件与应用级中间件相似,但绑定在 express 对象,使用router.use 和 router.method (需要处理 http 请求的方法,例如get、put、post)。
1 | var app = express(); |
错误处理中间件
错误处理中间件,一定要声明四个参数,即使不需要next对象,也必须在参数中声明它,否者会被识别为一个常规中间件,无法处理错误信息。
1 | app.use((err, req, res, next) => { |
内置中间件
Express 从版本 4.x 开始,Express不再依赖 Content ,除了 express.static(处理静态资源), 以前内置的中间件现在已经全部单独作为模块安装使用。
1 | const options = { |
第三方中间件
使用第三方中间件,为 Express 应用增加更多的功能,可以在应用级中加载,也可以在路由级中加载。
1 | // terminal |
原理
我们可以通过 Express 的源码进行深入了解。在源码中,与中间件有关的有三部分:
- express.js继承application.js并对外暴露接口
- application.js挂载了所有核心方法
- router文件夹处理路由逻辑
以下是两端核心实现代码:
1 | /** |
1 | var index = 0 |
通过源码,可以看得出中间件是线性的,next 过后继续寻找下一个中间件,这种模式直觉上也很好理解,中间件就是一系列数组,通过路由匹配来寻找相应路由的处理方法也就是中间件。事实上connect也是这么实现的。app.use就是往中间件数组中塞入新的中间件。中间件的执行则依靠私有方法app.handle进行处理。