app.use()是添加全局中间件的唯一入口,不带路径参数时作用于全部路由,带路径参数时仅匹配前缀;路由级中间件需用链式调用或group分组实现,执行顺序和路径匹配决定中间件是否生效。

直接上手:安装 Fiber 后,app.Use() 是添加全局中间件的唯一入口;路由级中间件必须靠 app.Get("/path", middleware, handler) 链式调用或 app.Group() 组合实现,没有“自动注入到某段路由”的魔法配置。
怎么用 app.Use() 添加全局中间件
app.Use() 注册的是「路径前缀匹配」中间件,不是「所有请求都执行」——它只对 c.Path() 以指定前缀开头的请求生效。比如 app.Use("/api", logger),请求 /api/users 会进,但 /health 不会。
- 不带路径参数时(
app.Use(logger))才真正作用于全部路由,包括/和静态文件 - 多个
app.Use()调用按注册顺序执行,顺序错会导致 CORS 预检失败、日志漏打、认证被跳过 -
app.Use()的 handler 必须是fiber.Handler类型,不能直接传函数字面量而不满足签名(常见错误:app.Use(func() {})编译不过)
怎么给特定路由加中间件(非全局)
两种可靠方式:链式注册、分组注册。别试图在 handler 里手动调用中间件函数——那只是普通函数调用,c.Next() 不起作用,上下文也不延续。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 链式写法:
app.Post("/login", authMiddleware, loginHandler),中间件按从左到右顺序执行,任一返回 error 或调用c.SendXXX()就终止后续 - 分组写法:
v1 := app.Group("/v1"); v1.Get("/users", authMiddleware, listUsers),注意v1.Get()的路径必须带开头/,否则注册成/users而非/v1/users - 不要混用:
app.Use("/v1", authMiddleware); app.Get("/v1/users", handler)看似等效,但前者会拦截所有/v1/*(含/v1/static/logo.png),后者更精确
为什么中间件里调 c.Next() 却没进下一个 handler
最常见原因是中间件注册位置不对,或路径匹配失败。Fiber 的中间件执行依赖「路由树匹配结果」,不是简单堆栈调用。
-
c.Next()只会把控制权交还给当前匹配到的路由链中的下一个 handler,如果该路由只注册了一个 handler,c.Next()就直接返回了 - 用
c.Path()判断路径时,它不含 query string,所以/user?id=1的c.Path()是/user;误用c.OriginalURL()做前缀判断会导致中间件失效 - 中间件函数签名必须是
func(*fiber.Ctx) error,少个error返回值就会编译报错,别靠 IDE 自动补全猜类型
CORS、重定向、鉴权中间件的典型陷阱
这些中间件对执行顺序和参数极其敏感,错一个就静默失败。
- CORS 中间件必须放在所有需要跨域的路由之前,且
AllowCredentials: true时AllowOrigins不能为"*",否则浏览器直接丢响应 - 重定向中间件(如去除尾部
/)要用app.Use()全局注册,不能只挂某个 group,否则/admin/这类路径不会被处理 - 鉴权中间件里用
strings.HasPrefix(c.Path(), "/api/private/")比硬编码== "/api/private/user"更健壮,避免漏掉子路径
真正的难点不在语法,而在理解 Fiber 的中间件是「路径匹配后插入的 handler 链」,不是 Express 那种自由组合的管道。一旦注册路径和实际请求路径对不上,中间件就彻底隐身——连日志都不会打。调试时优先检查 c.Path() 输出和路由注册日志,别先怀疑中间件逻辑。










