Iris中Party().Use()在BeforeActivation内无效,因该钩子阶段子路由器未激活,中间件挂载不进执行链;须先完成所有路由注册再调Use(),且必须在app.Listen()前执行。

中间件不生效,大概率是注册时机或作用域错了,不是函数写得不对。
为什么 Party().Use() 在 BeforeActivation 里调无效
很多人在 BeforeActivation 钩子里创建子路由后立刻调 admin.Use(authMiddleware),结果请求完全不进这个中间件。因为 BeforeActivation 是路由“编译前”的阶段,此时 Party() 返回的子路由器还没激活,Use() 挂载的中间件根本不会进入最终执行链。
- 必须在
BeforeActivation内部先完成所有.Get()、.Post()等路由注册,再对同一Party实例调Use() - 该
Use()调用必须发生在app.Listen()或app.Run()之前,否则整个中间件链压根没加载 - 如果子路由里还嵌套了更深层的
Party()(比如admin.Party("/settings")),父组的Use()不会自动继承,必须显式再调一次
ctx.Next() 后还执行业务逻辑?检查是否漏掉 ctx.StopExecution()
Iris 的 ctx.Next() 不会自动中断后续代码,它只负责把控制权交给下一个中间件或 handler。鉴权失败后写了 ctx.JSON(401, ) 却没跟 ctx.StopExecution(),业务 handler 仍会被执行——这是最隐蔽也最危险的 bug。
- 中间件中一旦写响应(
ctx.JSON、ctx.StatusCode+ctx.WriteString等),必须紧跟ctx.StopExecution() - 不要依赖
if err != nil { ... }分支自然结束:分支外若还有ctx.Next(),它照常执行 - 调试时可在中间件开头加日志:
ctx.Application().Logger().Infof("auth running for %s", ctx.Path()),确认是否被触发
跨域中间件为啥报 preflight 失败
前端报 Response to preflight request doesn't pass access control check,90% 是 OPTIONS 请求根本没走到中间件,而不是头没设对。Iris 不会自动捕获预检请求,必须显式注册 OPTIONS 路由,否则中间件连执行机会都没有。
- 必须用
app.Options("*", handler)或针对路径如api.Options("/users/*", handler)显式注册,不能只靠中间件里判断ctx.Method() == "OPTIONS" - OPTIONS handler 必须返回
204 No Content,且至少包含Access-Control-Allow-Methods和Access-Control-Allow-Headers -
Access-Control-Allow-Origin设为"*"时,Access-Control-Allow-Credentials必须为false;若需传 cookie,就得硬编码具体 origin(如"http://localhost:3000")
全局中间件为啥对子路由组失效
app.Use(commonLogger) 注册后,v1 := app.Party("/api/v1") 下的请求却没日志——Iris 没有“自动继承”机制。根路由组的中间件不会透传到子 Party,这是设计使然,不是 bug。
- 每个
Party都是独立中间件链,要生效就得单独调v1.Use(commonLogger) - 如果多个分组都要同一套中间件,建议封装成函数,在每个
Party创建后统一调用 - 注意中间件顺序:先注册的先执行,
app.Use(recover.New())应放在最前面,确保 panic 能被捕获
最容易被忽略的是中间件注册的“时间点”和“作用域”——它们比函数内容本身更决定成败。Iris 不做隐式推导,所有挂载都必须手动、显式、在正确生命周期内完成。


















