中間件

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容