fiber中间件是嵌入请求生命周期的函数,签名必须为func(*fiber.ctx) error,需显式声明指针类型;必须调用c.next()继续流程,返回非nil error则终止请求;支持全局、路径前缀、路由级三种注册作用域。

要在Fiber应用中拦截请求、记录日志、校验权限或修改响应,必须自定义中间件——它不是插件式开关,而是嵌入在请求生命周期中的函数。
理解中间件的函数签名
Fiber中间件是一个接受 *fiber.Ctx 参数并返回 error 的函数,签名必须严格为:func(c *fiber.Ctx) error。任何其他签名(比如多参数、无返回值、返回布尔值)都会导致编译失败或运行时 panic。
这一步不能省略类型声明,【c *fiber.Ctx 必须显式声明指针类型】,因为 Fiber 会复用上下文对象,传值会导致状态错乱。
编写最简中间件:打印请求路径
方法一:匿名函数直接注册
在路由前调用 app.Use(),传入一个符合签名的函数:
app.Use(func(c *fiber.Ctx) error { fmt.Println("→ 接收到请求:", c.Path()); return c.Next() })
注意:必须调用 c.Next() 才能让请求继续向下执行;不调用就等于中断流程,后续路由和处理器完全不会触发。
封装可复用的中间件函数
方法二:定义命名函数,支持传参配置
第一步:定义带参数的工厂函数,返回中间件
func LoggerWithPrefix(prefix string) fiber.Handler { return func(c *fiber.Ctx) error { fmt.Printf("[%s] %s %s\n", prefix, c.Method(), c.Path()); return c.Next() } }
第二步:在 app 初始化后注册
app.Use(LoggerWithPrefix("DEBUG"))
第三步:该中间件即可被多次复用,且每次调用生成独立闭包,互不干扰。
这一步的关键是返回值类型必须是 fiber.Handler,它是 func(*fiber.Ctx) error 的别名——类型匹配错误会导致编译失败。
实现带错误处理的中间件
方法三:检查请求头并提前终止
写一个只允许特定 User-Agent 访问的中间件:
func BlockBadBots() fiber.Handler { return func(c *fiber.Ctx) error { ua := c.Get("User-Agent") if strings.Contains(ua, "BadBot") || strings.Contains(ua, "Scanner") { return c.Status(403).SendString("Access denied") } return c.Next() } }
这里直接返回 c.Status(403).SendString(...),它本身是 error 类型,因此无需额外 return nil 或调用 Next。一旦返回非 nil error,Fiber 就终止链式调用并写出响应。
【中间件中 return 非 nil error = 立即结束请求,不再执行后续中间件和路由处理器】
注册中间件的三种作用域
① 全局生效(所有路由):用 app.Use(中间件)
② 指定路径前缀生效:用 app.Use("/api", 中间件),仅匹配 /api/xxx 开头的请求
③ 路由级局部生效:在某个路由方法中插入,如 app.Get("/user", authMiddleware, userHandler),只对该 GET 处理器起作用
注意:多个 Use() 调用按代码顺序依次注册,顺序错位可能导致鉴权逻辑失效。











