本文主要介绍下express框架中的中间件
(1)目录架构
首先新建目录express-middleware,初始化姓名,安装express模块
(2)编写入口文件
接下来启动项目,做下测试
接下来开始介绍中间件
(3)中间件
作用:主要是用来处理请求的,本质就是个函数
中间件本身是一个方法,接收3个参数:request请求对象、response响应对象、next下一个中间件(可选参数,需要调用下一个中间件时使用)
当请求进来,会从第一个中间件开始进行匹配。如果匹配则进入,如果不匹配,则向后依次对比匹配
注意:执行顺序与调用顺序
主要场景:将一个请求的处理过程,分发到多个环节中,目的效率高,便于维护。即每个环节专门干一件事
首先要清楚,在Express里中间件有几种分类
1、万能匹配:不关心请求路径和请求方法的中间件
也就是说,任何请求都会进入这个中间件
接下来启动服务器,访问localhost:3000端口,便会发送请求到服务器,此时服务器输出如下
即使请求路径更改任然会接受请求,如下所示
以上为get请求,接下来测试下post请求。
这里使用postman工具进行测试,能够代替浏览器发送post请求,具体如下
1、选择请求类型
2、输入请求地址
3、点击send发送
4、查看服务端输出
中间件可以有多个,且参数为req、res、next,接下来做下测试
接下来调整下顺序,2在前,1在后
注意:默认该中间件是不会往后依次执行的
如果2和1调换顺序,如下
此时便只输出2,由此可以分析出
当一个请求进入中间件之后,如果想请求进入下一个中间件,必须通过next()交出控制权
所以next()是一个方法,用于调用下一个中间件
如果此时在3里发送响应
此时的请求,便经过了3个中间件
2、路径匹配,关心请求路径的中间件
以/xxx开头的路径中间件
例如以/ad开头的,在服务端输出请求路径(不包含/ad)
再例如以/a开头的,则输出/b(不包含/a)
接下来对上述案例做个综合
输出顺序为?
分析: 1、请求进入某个中间件之后,如果没有调用next则不会交出执行权,请求也不会向后走。 2、请求进入后是由上往下的,当请求进入后便会进行中间件匹配(第一个不关心请求路径和方法,任何请求都会进入,所以会匹配上;匹配进入后没有调用next则不会往下走)
所以结果只会输出1
接下来对上述案例做下调整
分析: 1、将/b放到a前,虽然是按顺序执行,但只有匹配上才会进入,所以next交出执行权后,会依次按顺序一个个对比,知道匹配上,才会进入。 2、虽然后面两个都匹配上了,但是没有next
3、匹配失败时输出内容
如果没有能匹配到的中间件,则Express会默认输出:Cannot GET 路径
4、严格匹配:请求方法和请求路径的中间件(用的最为频繁)
app.get(req,res[,next]) app.post(req,res[,next])
此时如果请求/a,则输出1,因为进入万能匹配中间件后,没有调用next,所以会停留在该中间件
(4)分类
1、万能匹配中间件(路径请求类型均不要求) 2、路径匹配中间件(路径匹配) 3、严格匹配中间件(路径和请求类型)
严格分类:
1、应用程序级别中间件(和具体业务不太相关,和请求方法没什么关系)
2、路径级别中间件
.