app.Use() 是 Fiber 注册中间件的唯一全局入口,路径需边界精确匹配(如 /api 匹配 /api 和 /api/users),注册顺序决定执行顺序,c.Next() 控制流程继续而非中断,子应用挂载需注意路径隔离与前缀覆盖规则。

app.Use() 是 Fiber 中注册中间件的唯一全局入口,不是“可选用法”,而是所有中间件生效的前提;漏掉它或写错前缀,中间件根本不会执行。
app.Use() 的路径匹配规则:不是模糊包含,而是边界精确
Fiber 的 app.Use() 不会匹配任意含子串的路径,只在两种情况下命中:请求路径完全等于前缀,或前缀后紧跟 /。比如 app.Use("/api") 能匹配 /api 和 /api/users,但不匹配 /apix 或 /api-key。
- 常见错误:写成
app.Use("/user")本意是覆盖所有用户相关路由,结果/users/search匹配了,/user-profile却被跳过——因为-不是路径分隔符 - 通配需求应改用
app.Use("/user*", func(c *fiber.Ctx) error { ... }),星号必须显式写出,Fiber 不自动补全 - 空字符串前缀
app.Use("", mw)等价于app.Use(mw),即全局生效,但语义不如后者清晰,建议统一用无前缀写法
中间件执行顺序:注册即顺序,没有“优先级”字段
Fiber 不提供 middleware priority、order index 这类配置项。中间件的执行流由 app.Use() 的调用顺序硬编码决定:先注册的先执行请求逻辑,响应阶段则倒序执行。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 日志中间件必须第一个注册,否则鉴权失败时响应阶段的日志不会打印(因为后续中间件已提前 return)
- 别把多个
app.Use()写在同一行或靠 IDE 自动格式化排版,手写时每行一个,避免视觉误判 - 路由级中间件(如
app.Get("/x", h, mw))总是在所有app.Use()之后、handler 之前执行,不能“插队”到全局链中间
中间件终止流程:return 才是中断,c.Next() 是继续
Fiber 中间件里是否调用 c.Next() 决定了后续处理器是否运行,但它本身不表示“跳过”。很多开发者误以为拒绝请求要主动调 c.Next() 再 return,这会导致 handler 仍被执行。
- 正确写法:鉴权失败直接
return c.Status(401).Send("unauthorized"),不碰c.Next() - 错误写法:
if !valid { c.Status(401).Send(); c.Next(); return }——c.Next()会继续触发后续中间件和 handler - 注意:一旦
c.Send()、c.JSON()或c.Status()+ body 被调用,Fiber 认为响应已发出,后续中间件的响应逻辑(如日志结束时间)仍会执行,但 handler 不会再进
子应用挂载:Use(path, subApp) 是组合服务的关键能力
app.Use("/admin", adminApp) 不是语法糖,而是 Fiber 将另一个 *fiber.App 实例挂载为子路由的正式机制。子应用内部的 app.Get("/users") 最终对外表现为 /admin/users。
- 子应用的中间件(包括其
app.Use())只作用于挂载路径下,与主应用隔离 - 子应用无法访问主应用的
c.Locals,除非手动透传,这是设计上的边界控制,不是 bug - 不要对同一路径重复挂载,比如
app.Use("/api", apiV1)和app.Use("/api/v2", apiV2)并存时,/api/v2/users只会进入apiV2,不会先进apiV1再进apiV2
前缀匹配和注册顺序这两点,是线上问题最常卡住的地方。前者看日志发现中间件没打点,八成是路径写成了 /user 却想覆盖 /users;后者看响应状态码对但业务逻辑没走,大概率是 c.Next() 多调了一次。


















