Iris路由级中间件是显式绑定到特定路由或路由组的函数,仅对匹配路径生效,执行顺序严格按注册位置从前到后;必须用.Use()链式调用或在Party上注册,且需显式调ctx.Next()才能继续,失败时应调ctx.StopExecution()或手动写响应后return。

什么是 Iris 路由级中间件
在 Iris 中,路由级中间件不是全局注册后自动生效的,而是显式绑定到某条或某组路由上的函数。它和全局中间件的关键区别在于执行范围:只对匹配的路由路径起作用,且顺序严格依赖注册位置(越靠前越先执行)。
常见错误是把 Use 当作全局注册方式直接调用,结果发现中间件没触发——其实 Use 必须在 Get、Post 等方法链上使用,或通过 WrapRouter 绑定到子路由器。
如何给单个路由添加中间件
最直观的方式是在定义路由时链式调用 Use 或 UseGlobal(注意:后者仍是路由级,只是作用于该路由及其所有子路径):
app.Get("/admin", func(ctx iris.Context) {
ctx.WriteString("admin page")
}).Use(func(ctx iris.Context) {
if !isAdmin(ctx) {
ctx.StatusCode(iris.StatusForbidden)
return
}
ctx.Next()
})
-
Use接收一个iris.Handler类型函数,必须显式调用ctx.Next()才会继续执行后续处理器 - 中间件函数里不能直接
return,否则会中断整个请求流程(包括响应写入),应改用ctx.StopExecution()或ctx.StatusCode()+return - 多个中间件可连续链式调用:
.Use(mw1).Use(mw2).Handle(...),执行顺序为 mw1 → mw2 → handler
如何批量绑定中间件到路由组
用 Party 创建子路由器后,可在其上调用 Use 一次性绑定中间件,影响该组下所有子路由:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
admin := app.Party("/admin")
admin.Use(authMiddleware, logMiddleware)
admin.Get("/users", usersHandler)
admin.Post("/posts", postsHandler)
注意:Party 返回的是新路由器实例,Use 只影响它及其后代,不影响父路由或其他 Party;如果想让中间件也作用于 /admin 本身(比如 GET /admin),需额外为根路径注册,或改用 WrapRouter。
-
WrapRouter是更底层的绑定方式,适用于需要修改路由匹配逻辑的场景,但日常权限/日志类中间件用Party.Use更清晰 - 若在
Party内部又嵌套Party,父级Use默认继承,无需重复注册 - 中间件中访问路由参数(如
:id)要等ctx.Params()可用,通常在ctx.Next()前已就绪,但别依赖ctx.Values()的初始状态
中间件里怎么安全地终止请求
路由级中间件常用于鉴权、限流、参数校验,失败时需立即停止后续处理并返回响应。错误做法是直接 return 或 panic,正确方式有三种:
- 调用
ctx.StopExecution():彻底中断当前请求生命周期,不执行后续任何 handler 或中间件,但也不会自动写响应体 - 手动写响应 +
return:如ctx.JSON(iris.Map{"error": "unauthorized"})后return,这是最常用、最可控的方式 - 调用
ctx.StatusCode(iris.StatusUnauthorized)并配合ctx.StopExecution(),适合仅需状态码无响应体的场景
容易忽略的一点是:Iris 的 ctx.Next() 不是“跳过当前”,而是“执行下一个 handler”,所以中间件里漏掉 ctx.Next() 会导致最终 handler 完全不执行,且无报错提示。


















