koa,rails里的中间件基本上就是java web里的filter, 都是采用的责任链设计模式
以lua为例,实现中间件模式:
--将收到的消息路由到各自的处理器上
--所谓的中间件
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 中间件列表,先入者先调用
核心在于next函数的构建上
next函数使用闭包构建出当前中间件列表的调用状态:
- i 当前调用的中间件索引
每调用一次next函数, i都将递增,然后调用i
所对应的中间件
中间件内部自己决定要不要调用next函数,什么时候调用next函数,通过在 调用前和调用后插入不同的代码,就可以在一次请求中进行预处理和后处理
用途
例:
-
数据库连接
在请求预处理阶段打开数据库连接,
在后处理阶段提交事务并关闭 -
请求日志
-
统一的错误处理
以http为例,在中间件捕获异常后,输出5xx statuscode
网友评论