nodejs的事件实现类似:
app.use(function (req, res, next) {
cosole.log(res)
next()
})
app.post(...)
类似上面,需要实现类似的事件效果:
event.watch('all', cb)
event.watch('[event type]', cb)
就是监控所有事件并作出反馈但不会影响事件的单独执行。这里使用once和emit创建触发事件
PHP中文网2017-04-17 14:52:20
以下內容主要分為兩部分:
express中間件大致實現。
題主最後的問題。
先大致說下express裡的路由中間件是怎麼實現的。 (為了減少複雜度,這裡先不說路由拆分的實作)
express
內部維護了一個叫做stack
的數據,當用戶調用類似app.post(path, fn)
這樣的路由註冊方法時,就會往stack
裡添加一個路由實例。這裡抽象的認為這個路由實例是 {path: path, handler: fn}
,其中,path
為路由對應的路徑,handler
為對應的中間件。
比較特殊的是app.all(path, fn)
,其實內部實作也不複雜,可以粗暴的認為,是遍歷一遍node支援的所有htp methods,然後呼叫路由註冊方法,例如app.get(path, fn)
、app.post(path, fn)
……(內部實現比這巧妙些,沒這麼粗暴)
網路請求過來,express
內部會偵測請求的http method、路徑,然後遍歷stack
數組,如果同時滿足 method相同 且 路由命中
,那麼,就呼叫對應的 中間件。
method相同 且 路由命中
的路由規則 可能有多個,那麼是怎麼實現多個中間件順序呼叫的呢?就是next
啦。 (實作略)
回到問題中的「事件效果」。參考上面的步驟,基本上就知道該怎麼實現了。