koa,rails里的中間件基本上就是java web里的filter, 都是采用的責(zé)任鏈設(shè)計(jì)模式
以lua為例耙饰,實(shí)現(xiàn)中間件模式:
--將收到的消息路由到各自的處理器上
--所謂的中間件
local m = {}
package.loaded[...] = m
--{fn(msg, next)}
m.middlewares = {}
function m.route(msg)
local next
next = (function ()
local i = 0
return function ()
i = i + 1
if i > #m.middlewares then return end
local middleware = m.middlewares[i]
return middleware(msg, next)
end
end)()
next()
end
function m.use(middleware)
table.insert(m.middlewares)
end
解釋
middlewares 中間件列表肴盏,先入者先調(diào)用
核心在于next函數(shù)的構(gòu)建上
next函數(shù)使用閉包構(gòu)建出當(dāng)前中間件列表的調(diào)用狀態(tài):
- i 當(dāng)前調(diào)用的中間件索引
每調(diào)用一次next函數(shù)尺借, i都將遞增范抓,然后調(diào)用i
所對應(yīng)的中間件
中間件內(nèi)部自己決定要不要調(diào)用next函數(shù)岔乔,什么時候調(diào)用next函數(shù)肉瓦,通過在 調(diào)用前和調(diào)用后插入不同的代碼永品,就可以在一次請求中進(jìn)行預(yù)處理和后處理
用途
例:
數(shù)據(jù)庫連接
在請求預(yù)處理階段打開數(shù)據(jù)庫連接,
在后處理階段提交事務(wù)并關(guān)閉請求日志
統(tǒng)一的錯誤處理
以http為例做鹰,在中間件捕獲異常后,輸出5xx statuscode