Iris中间件函数签名固定为func(iris.Context),必须接收ctx iris.Context参数且无返回值;需显式调用ctx.Next()才能继续流程,否则中断请求。

什么是 Iris 的中间件函数签名
Iris 中间件就是一个 iris.Handler 类型的函数,签名固定为:func(iris.Context)。它必须接收一个 ctx iris.Context 参数,且不能返回值。中间件内部必须显式调用 ctx.Next() 才能让请求继续向下执行——不调用就中断流程,相当于“拦下请求”。
常见错误是写成带返回值的函数(比如 func() error),或漏掉 ctx.Next() 导致后续路由/处理器完全不执行。
- 中间件不是装饰器,也不支持返回值或链式构造
-
ctx.Next()不是可选的:它控制执行流是否进入下一个中间件或最终处理器 - 多个中间件按
Use()注册顺序依次执行,先注册的先运行
如何注册全局、分组、路由级中间件
注册位置决定作用域,三者互不影响:
-
app.Use(...):全局中间件,对所有路由生效(包括未匹配路径) -
party.Use(...):只影响该Party及其子分组的所有路由,比如admin.Party("/users").Use(auth) -
app.Get("/path", middleware1, middleware2, handler):仅对该路由生效,顺序即执行顺序
注意:UseGlobal() 优先级最高,总在所有其他中间件之前执行;而 Done() 是后置钩子,用于响应阶段,不参与请求流转控制。
自定义中间件里怎么安全读取和修改请求/响应
中间件中访问请求数据要小心边界条件,比如空 body、非法 header、未设置的 query 参数:
- 读 JSON body 前先检查
ctx.Request().ContentLength > 0,否则ctx.ReadJSON()可能 panic - 获取 header 推荐用
ctx.GetHeader("X-Auth-Token")而非ctx.Request().Header.Get(...),前者自动处理大小写和空值 - 写响应时避免重复设置 status code:如果下游已写过
ctx.StatusCode(401),你再调一次会覆盖但不报错,容易掩盖逻辑问题 - 修改
ctx.Values()是安全的跨中间件传参方式,比如存解析后的用户 ID:ctx.Values().Set("user_id", 123)
为什么中间件里加日志后看不到请求完成时间
因为日志中间件若只在开头打印 “start”,没在结尾补上 “end” 或耗时计算,就无法得知整个请求生命周期。Iris 没有自动的“进入/退出”钩子,必须手动配对。
正确做法是用 ctx.OnClose() 或在 ctx.Next() 后续立即记录:
func loggingMiddleware(ctx iris.Context) {
start := time.Now()
ctx.Application().Logger().Infof("→ %s %s", ctx.Method(), ctx.Path())
ctx.Next()
// 注意:这里 ctx.ResponseWriter() 已可能被写入,status 可能已发
status := ctx.GetStatusCode()
latency := time.Since(start)
ctx.Application().Logger().Infof("← %d %s %v", status, ctx.Path(), latency)
}
真正容易被忽略的是:如果下游 panic 且没被 recover 中间件捕获,ctx.Next() 后的代码不会执行——所以耗时统计、清理逻辑应放在 ctx.OnClose() 或专用 recover 中间件里。


















