koa,rails里的中間件基本上就是java web里的filter, 都是采用的責(zé)任鏈設(shè)計模式
以lua為例,實現(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