express.js源码阅读笔记
gsbybbgsbybb -express 本质上就是一个封装过的
http.createServer
的回调函数express中主要有以下几个核心概念
applicationrouterroutelayer每一个application上会有一个router实例,这个router实例会是application的一个属性且是单例的,会在特定场景初始化,例如app.use
、app.get
等方法初始化。app.use
、app.get
等方法本质上最终还是会调用到application上的router实例上对应的方法,比如app.use
其实是调用router实例上的use方法、app.get
其实是调用router实例上的route方法。router实例上有一个stack属性,是数组类型,用来存放一个个layer实例layer的主要最作用就是用来存储一个路径path和路径对应的请求处理函数fn。通过app.use(fn)
(也就是router.use(fn)
),可以创建的一个layer,对应的path是/
,fn就是传入的函数通过router.route(path)
也可以创建一个layer,对应的path是/
,layer存储是route.dispatch.bind(route)
,route就是前面创建的route实例。router.route(path)
会把创建的route实例return出去,可以看下面的代码辅助理解app.route('/list')
.get((req, res) => { res.end('hello get'); })
.post((req, res) => { res.end('hello post'); })
.put((req, res) => { res.end('hello put'); })
.delete((req, res) => { res.end('hello delete'); });
route实例上也有一个stack属性,同样是数组类型,存放的也是layer。通过调用route实例暴露出来的方法,就会创建一个layer,例如app.route('/list')
.get((req, res) => { res.end('hello get'); })
上述代码会在router创建的route里,再创建一个layer保存get(fn)
中的fn函数
/
,但因为route也有path属性,所以可以理解route上的layer对应的path是route.path + '/'
根据layer存储位置的不同,可以把一个express app分为两层
存储在router上的layer构成的中间件层
存储在route上的layer构成的路由层
路由层
可以看做是中间层
的下属层级。
中间件层
的layer,有两种类型,一种有route属性,一种没有route属性,有route属性的layer上,可以通过layer.route
找到对应的路由层
。当一个请求访问到express app对应的server时,会调用app.handle
方法,在app.handle
中调用router.handle
,在router.handle
中会遍历中间件层
的layer,取出每一个layer进行处理,如果layer上有route属性,会进入到route对应的路由层
去处理这一层的所有layer,处理完成之后,再回到上一层layer 特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。
上一篇: 从零打造你的前端开发脚手架
下一篇: 90%的Java开发人员都会犯的5个错误