关于node.js:expressjs源码阅读笔记

54次阅读

共计 1392 个字符,预计需要花费 4 分钟才能阅读完成。

  • express 实质上就是一个封装过的 http.createServer 的回调函数
  • express 中次要有以下几个外围概念

    1. application
    2. router
    3. route
    4. layer
  • 每一个 application 上会有一个 router 实例,这个 router 实例会是 application 的一个属性且是单例的,会在特定场景初始化,例如 app.useapp.get 等办法初始化。
  • app.useapp.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 实例上的 layer,对应的 path 都是/,但因为 route 也有 path 属性,所以能够了解 route 上的 layer 对应的 path 是route.path + '/'
  • 依据 layer 存储地位的不同,能够把一个 express app 分为两层

    1. 存储在 router 上的 layer 形成的 中间件层
    2. 存储在 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

正文完
 0