go get 必须带 /v2 后缀,否则静默安装已废弃的 v1 版本(不兼容 Go 1.21+,运行 panic);推荐用 go get github.com/gofiber/fiber/v2,v3 仅实验;import 路径严格隔离;fiber.New() 是唯一安全初始化方式,禁用 fiber.Default();StrictRouting 默认开启,/users 与 /users/ 视为不同路径;中间件顺序关键:recover → logger → cors。

go get 命令必须带 /v2 后缀,否则默认拉 v1(已废弃)
直接 go get github.com/gofiber/fiber 会静默安装早已归档的 v1 版本,它不兼容 Go 1.21+,运行时 panic 报 undefined: fiber.New。正确命令只有两个:
-
go get github.com/gofiber/fiber/v2(生产项目唯一推荐) -
go get github.com/gofiber/fiber/v3(仅限实验,需 Go 1.24+ 且生态未对齐)
v2 和 v3 的 import 路径不能混用,import "github.com/gofiber/fiber/v2" 和 import "github.com/gofiber/fiber/v3" 是完全隔离的模块。
fiber.New() 是唯一安全初始化方式,别碰 fiber.Default()
fiber.Default() 看似省事,但它默认启用 Logger、Recover、RequestID 三个中间件,上线后每秒写数百行日志,TTFB 直接多出 0.5ms 以上。真实部署必须用:
app := fiber.New()
后续按需添加:
- 调试环境:只加
logger.New(),并设置logger.Config{Format: "[${time}] ${status} - ${method} ${path}\n"} - 生产环境:用
recover.New(recover.Config{EnableStackTrace: false})关闭堆栈输出 - 绝对不要全局加
cors.New(),只在需要跨域的路由组里注册
StrictRouting 导致 /users 和 /users/ 404?不是 bug 是设计
注册了 app.Get("/users", handler) 却访问 /users/ 返回 404,不是路由写错,是 Fiber 默认 StrictRouting: true。它把结尾斜杠视为路径语义差异。解决方案只有两个:
- 显式注册双版本:
app.Get("/users", handler)和app.Get("/users/", handler) - 加重定向中间件统一处理(更推荐):
app.Use(func(c *fiber.Ctx) error { if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { return c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } return c.Next() })
千万别设 fiber.New(fiber.Config{StrictRouting: false})——当存在 /users 和 /users/:id 时,/users/123 会被前者匹配,c.Params("id") 拿不到值,问题更隐蔽。
中间件顺序决定行为,Logger 必须在 Recover 之后
Fiber 中间件执行顺序严格按注册顺序。常见错误是把 logger.New() 放在最前,结果 panic 发生时日志没打完就进程退出,看不到上下文。正确顺序是:
app.Use(recover.New()) // 先捕获 panic app.Use(logger.New()) // 再记录完整请求生命周期 app.Use(cors.New()) // 最后加业务相关中间件
自定义中间件若依赖 c.Locals 或修改响应头,必须放在 logger 之后,否则日志里看到的 status 可能是 200,实际返回却是 500。


















