必须用fiber.New()而非fiber.Default()——后者自动启用Logger(泄露Authorization头)、Recover(暴露堆栈)、RequestID(白占资源),导致TTFB增加0.3–0.8ms且高并发下I/O瓶颈;StrictRouting使/users与/users/视为不同路径,需显式注册或重定向,不可关闭。

别用 fiber.Default() 启动生产服务——它默认开启的中间件会泄露 Authorization 头、增加 TTFB 0.3–0.8ms,高并发下还可能压垮 I/O。
为什么必须用 fiber.New() 而不是 fiber.Default()
你不是在“少用功能”,而是在规避默认行为引发的线上事故:
-
fiber.Default()自动挂载Logger:全量打印请求 header 和 body,敏感字段(如 token、密码)直接裸奔 - 自动启用
Recover:panic 后返回 500 + 完整堆栈,前端能看见源码路径、变量名甚至行号 - 自动注入
RequestID:若没配采样或接入 tracing 系统,只是白占内存和带宽 - 所有中间件共享同一个
ctx实例,顺序错一位就可能覆盖响应头或提前写响应体
正确姿势是显式初始化:app := fiber.New(&fiber.Config{CaseSensitive: true, StrictRouting: true}),再按需加中间件。CI/CD 流水线里必须检查是否已替换。
StrictRouting 导致 /users 和 /users/ 都 404?这不是 bug 是路由契约
Fiber 默认把两者视为完全不同的路径。你只注册了 app.Get("/users", handler),那 GET /users/ 必然 404——前端发错一个斜杠就挂。
- 别关
StrictRouting: false:关掉后/users/123可能被/users匹配,c.Params("id")拿不到值 - 显式注册两条路由:
app.Get("/users", handler)和app.Get("/users/", redirectHandler) - 或加统一重定向中间件:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) }
上线前同步检查 OpenAPI spec、前端 SDK、Postman 集合是否全用无尾斜杠路径。
c.Params("id")、c.QueryParam("q")、c.BodyParser(&v) 别混着用
三者来源完全隔离,错一个就空值:
-
c.Params("id")只读路径占位符,比如app.Get("/user/:id")匹配/user/123后的"123";对?id=123或 JSON body 无效 -
c.QueryParam("q")只读 query string,如/search?q=go中的"go";不解析路径、body、header -
c.FormValue("name")是给application/x-www-form-urlencoded准备的;JSON 必须用c.BodyParser(&v)
常见错误现象:前端传 JSON 但 handler 写 c.QueryParam("id"),结果始终为空;或路径没定义 :id 却调 c.Params("id"),返回空字符串而非报错。
最易被忽略的是 ctx 值的生命周期——c.Params()、c.QueryParam() 返回的都是底层缓冲区切片,不能跨 handler 保存引用。需要持久化时,必须用 utils.CopyString() 或手动 copy(),否则下次请求会看到脏数据。


















