Iris中间件函数签名固定为func(iris.Context),必须显式调用ctx.Next()才能继续流程,否则请求立即中断;漏调ctx.Next()或错误添加返回值均导致中间件失效。

必须显式调用 ctx.Next(),否则请求流程立即中断
中间件函数签名固定为 func(iris.Context),不接受返回值,也不参与链式构造。你写一个带 error 返回的函数,Iris 不会报错,但根本不会把它当中间件注册——它直接被忽略。
- 漏掉
ctx.Next()是最常见错误:请求停在该中间件,后续所有路由处理器、其他中间件全不执行,浏览器卡住或返回空响应 - 提前返回(如鉴权失败)时,必须配对使用
ctx.StopExecution(),仅写ctx.StatusCode(401)不够,Iris 仍会继续往下走 - 多个中间件按
Use()调用顺序执行,先注册的先运行;UseGlobal()的中间件总在最前
怎么注册全局、分组、单路由三级中间件
作用域由注册位置决定,三者完全独立,互不影响:
-
app.Use(middleware):对所有匹配/不匹配的请求都生效(包括 404) -
admin := app.Party("/admin"); admin.Use(auth):只影响/admin/*及其子分组(如/admin/users) -
app.Get("/api/data", middleware1, middleware2, handler):仅对该GET路由生效,执行顺序即参数顺序
注意:Party() 创建的子分组必须基于父分组调用,比如 users := admin.Party("/users"),路径才是 /admin/users;若直接 app.Party("/users"),就和 /admin 毫无关系。
为什么加了日志中间件却看不到请求耗时
因为 Iris 没有自动的“进入/退出”钩子。只在开头打 "start",不手动补结尾逻辑,就永远拿不到结束时间。
- 正确做法是用
ctx.OnClose()注册清理回调,或在ctx.Next()后立刻记录结束时间 - 别依赖
defer:中间件函数返回不等于请求结束,defer可能过早触发 - 若中间件里调用了
ctx.StopExecution(),ctx.OnClose()仍会执行;但defer不会——这是关键区别
安全头、CORS、维护模式这些常见场景怎么套用
它们本质都是中间件,但容易踩坑的点高度一致:
- 安全头(如
X-Content-Type-Options)必须在中间件开头用ctx.Header()设置,否则下游 handler 可能覆盖;OPTIONS预检请求也得覆盖到,不能只在ctx.Next()后设 - CORS 中间件必须配合
app.Options("*", ...)显式注册通配 OPTIONS 路由,否则预检请求根本进不来中间件 - 维护模式要用
app.UseGlobal()+ 文件/配置检查 +ctx.StatusCode(503)+ctx.StopExecution(),缺一不可;静态资源默认不走中间件链,无需额外排除
真正难的不是写中间件,而是控制好执行时机和边界条件:什么时候该 StopExecution,什么时候必须 Next,哪些头必须前置设置,哪些响应阶段才可读取 body —— 这些细节不处理好,中间件就只是个摆设。


















