• 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