gin中间件通过use()、路由参数或group()注入,注册方式错误会导致不执行、顺序错乱或panic;全局中间件必须用r.use()注册在engine上,单路由中间件写在get等方法的handler前,中间件函数须为gin.handlerfunc类型且正确调用c.next()或c.abort()。

Gin 中间件不是“加载”出来的,而是通过 Use()、路由定义时传参或 Group() 构造时注入的;错用注册方式会导致中间件不执行、顺序错乱或 panic。
全局中间件必须用 Use() 注册在 gin.Engine 上
只有调用 r.Use(middleware) 才会把中间件挂到所有路由的处理链开头。常见错误是误写成 r.GET("/path", middleware, handler) —— 这属于单路由中间件,只对那个接口生效。
-
gin.Default()已默认注册Logger()和Recovery(),无需重复加 - 若用
gin.New(),必须手动Use()注册必要中间件,否则无日志、panic 不恢复 - 多个
Use()调用按顺序追加,Use(A); Use(B)表示 A → B → handler
路由组中间件要写在 Group() 参数里,或紧跟 Use()
两种写法等价,但参数写法更紧凑,Use() 写法更易读且支持条件分支:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 参数式:
api := r.Group("/api", AuthMiddleware(), LoggerMiddleware()) -
Use()式:api := r.Group("/api"); api.Use(AuthMiddleware()).Use(LoggerMiddleware()) - 注意:不能写成
r.Group("/api").Use(...).GET(...)——Group()返回的是新分组,Use()作用于该分组,但链式调用后未保存分组引用,GET()实际注册到根路由
单路由中间件直接放在 GET() 等方法的 handler 前
适用于仅需对某个接口生效的逻辑(如特定接口的限流、调试钩子):
- 写法:
r.POST("/upload", RateLimitMiddleware(), uploadHandler) - 中间件函数必须是
gin.HandlerFunc类型,不能是闭包返回值未显式转为gin.HandlerFunc的函数 - 多个中间件按从左到右顺序执行,
RateLimitMiddleware→AuthMiddleware→uploadHandler - 若中间件内部没调用
c.Next(),后续中间件和 handler 将被跳过
c.Next() 是控制流程的关键,漏写或错放位置会导致逻辑断裂
中间件中不写 c.Next(),后续所有 handler 和中间件都不会执行;写在中间件末尾则变成纯“后置处理”,无法拦截请求。
- 典型结构:
preCheck(); c.Next(); postLog()—— 前置校验 + 放行 + 后置记录 - 想中断流程(如鉴权失败),应调用
c.Abort()或c.AbortWithStatusJSON(),之后不再执行c.Next()及后续 handler -
c.Next()不是“调用下一个”,而是“让整个链继续往下走”,它本身不返回值,也不阻塞;panic 发生时,c.Next()后的代码仍会执行(用于 recover)
最常被忽略的是中间件注册时机与作用域的错配:比如在 Group() 外注册了本该只用于管理后台的权限中间件,结果连健康检查接口也被拦住;或者把 c.Next() 忘在了日志中间件里,导致所有请求都卡死在日志环节。写完中间件务必用 curl 测一遍完整链路,别只看是否编译通过。










