BeforeActivation 中注册路由组时不能直接 Use 全局中间件,因 Party 返回的子路由器尚未激活;正确做法是在该钩子内完成所有路由注册后再对 Party 实例调用 Use(),且必须在 app.Listen() 前执行。

BeforeActivation 里注册路由组时不能直接 Use 全局中间件
很多人在 BeforeActivation 钩子里用 router.Party("/admin") 创建子路由后,立刻调 admin.Use(myMiddleware),以为这样就能给整个组加拦截器——但实际无效。因为 BeforeActivation 的上下文里,Party() 返回的子路由器尚未激活,此时调 Use() 不会挂载到最终生效的中间件链上。
正确做法是:在 BeforeActivation 内部先完成所有路由注册(包括 Get、Post 等),再对返回的 Party 实例统一调 Use(),且必须在 app.Listen() 或 app.Run() 之前执行。
-
BeforeActivation是路由“编译前”的钩子,只适合做路由结构定义,不适合做运行时行为绑定 - 子路由组的
Use()必须在Party()调用之后、该组内所有.Get()等方法注册完成之后立即调用 - 如果中间件要作用于整个组(含嵌套子组),需显式向每个
Party实例调用Use(),父组不会自动继承
用 Party().Use() 绑定拦截器必须手动传入中间件函数
Party().Use() 接收的是 iris.Handler 类型,不是字符串名或配置项。常见错误是传入未定义变量、拼错函数名,或误传 func(iris.Context) 外层包装器(比如包了一层闭包但没调用)。
示例中容易出错的写法:admin.Use(authMiddleware()) —— 如果 authMiddleware() 返回的是 iris.Handler,那没问题;但如果它返回的是另一个类型(如 func() iris.Handler),就会 panic 或静默失败。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 确保传给
Use()的值是可直接执行的iris.Handler,例如authMiddleware(不带括号) - 调试时可在中间件开头加日志:
ctx.Application().Logger().Infof("auth middleware running for %s", ctx.Path()),确认是否被触发 - 若需参数化中间件(如不同权限级别),用闭包工厂模式:
admin.Use(roleRequired("admin")),其中roleRequired返回iris.Handler
全局拦截器 ≠ 所有路由都走同一中间件链
Iris 没有“全局拦截器”这个内置概念。所谓“全局”,实际是指对根 Party(即 app 本身)调用 Use()。但要注意:一旦你用 Party() 分组,该组默认不继承父级中间件,必须手动补上。
典型漏配场景:你在 app.Use(commonLogger) 后又建了 v1 := app.Party("/api/v1"),但忘了 v1.Use(commonLogger),结果 /api/v1 下的请求不打日志。
- 根
app.Use()只影响直接注册在app上的路由,不影响任何Party子组 - 嵌套
Party(如v1.Party("/users"))同样不继承上层Party的中间件,每级都要显式Use() - 若想强制继承,可封装一个注册函数,统一处理各级
Party的Use()调用
别在 BeforeActivation 外补路由或中间件
最隐蔽的坑:有人在 BeforeActivation 里注册一部分路由,然后在 main() 函数里又写 app.Get("/health", healthHandler) —— 这些“补丁路由”会被挂到默认路由器,和 BeforeActivation 中注册的路由不在同一激活上下文,导致中间件不生效、甚至 404。
根本原因:Iris 的路由激活是分阶段的。BeforeActivation 是预编译阶段,而 app.Get() 在运行时注册,两者路由树不合并。
- 所有路由(含分组内路由)必须在
BeforeActivation钩子内部完成注册 - 中间件绑定也必须在同一次钩子调用中完成,不能拆到多个地方
- 如果项目大,建议把每个模块的路由+中间件封装成独立函数,在
BeforeActivation里集中调用
Party 是惰性构造的,Use() 调用时机和路由注册顺序稍有偏差,行为就完全不同。最容易被忽略的是嵌套子组的中间件遗漏——你以为加了一次就够了,其实每级都得单独加。


















