express提供丰富的http工具,快速处理请求,响应。核心功能中间件,路由,基于三个类来实现,Router,Layer,Route。
1.Router
主要核心内容:
- stack数组存放子路由,中间件。
- handle方法,循环stack数组,根据规则执行响应回调函数。
一般添加一个路由会这样写代码:
1 | app.get('/list', function (req, res) { |
在Router里面做了一件事来支持这样的写法:
1 |
|
express中路由和中间件都是放在了stack数组里面,那么就有顺序问题,如果use一个中间件那么需要放在路由前面。
1 | const express = require('express'); |
next表示通过,可以执行下个中间件或路由,如果发生错误,则可以抛出错误,交给错误中间件处理,错误中间件接受4个参数,4个参数的use就代表了错误中间件.第一个参数为错误信息
1 | app.use((req, res, next) => { |
当请求来时,会执行handle,循环stack,发现path相同,method相同,那么调用对应callback。这样处理,带来了一个问题,如果路由不断增多,stack数组会不断增大,匹配效率下降,为了提高效率,express引入了route,layer.
2.Layer
把同一个path形成一层,并提供match方法进行匹配判断,handle方法来执行当前层的深入匹配methods。
简单理解就是匹配一个路径,然后执行回调方法。
那么当一个路由注册的时候,则新生成一个Layer实例,如果剩下还有路由路径相同,则放在该层。怎么去放入这层的,在Route做。
3.Route
Layer形成了层,但没有做匹配methods的事情,那么这个事情由Route来做。在Layer里面会传入一个handle方法,那么这个handle方式就是Route里面的dipatch方法,当Layer的路径已经匹配成功,就会交给Route来匹配method,Route的对象存放所有注册的方法名,用于快速匹配是否有注册该方法,在Route里面又复用了Layer,去执行真正回调处理函数。
4.实现高效率匹配
1 | app.route('/list').get((req, res) => { |
下面看一个伪代码,看如何去实现的app.route方法:
1 | app.route = function(path) { |