应使用 fiber.New() 而非 fiber.Default(),因后者自带中间件、日志泄露风险及额外0.3–0.8ms延迟;StrictRouting 导致 /users 与 /users/ 被视为不同路径而404;QueryParam 读 query string,Params 读路由占位符;FormValue 不适用于 JSON,需用 Body() 或 Struct();Next() 是否继续执行取决于是否已写响应;中间件顺序和 ctx 实例共享影响路由匹配与行为。

fiber.New() 是你该用的起点,不是 fiber.Default() —— 除非你明确接受它自带的中间件、日志泄露风险和那额外 0.3–0.8ms 的 TTFB 延迟。
为什么 app.Get("/users") 对 /users/ 返回 404
Fiber 默认开启 StrictRouting,把 /users 和 /users/ 当作两个完全不同的路径。这不是 bug,是设计选择。
- 常见现象:前端发
GET /users/,后端没注册这条路由,直接 404;但curl http://localhost:3000/users没问题 - 临时解法:初始化时传
fiber.Config{StrictRouting: false},但注意——若同时有/users和/users/:id,/users/123可能被前者捕获(因为关闭 strict 后,/users/会匹配/users路由) - 更稳做法:加一个重定向中间件,统一把带尾斜杠的请求 301 到无斜杠版本,或显式注册两条路由:
app.Get("/users", ...)和app.Get("/users/", ...)
ctx.QueryParam("q") 总是空,但 ctx.Params("id") 能取到
这是 URL 解析类型混淆的典型表现:两者读的是完全不同的位置。
-
ctx.QueryParam("q")只读?q=abc这种 query string,不看路径 -
ctx.Params("id")只读路由定义里的占位符,比如app.Get("/user/:id", ...)中的:id,对应/user/123里的123 - 如果 URL 是
/user/123?format=json,那么ctx.Params("id") == "123",ctx.QueryParam("format") == "json" - 别用
ctx.FormValue去读 JSON body,那是给application/x-www-form-urlencoded准备的;JSON 请用c.Body()+json.Unmarshal或c.Struct(&v)
ctx.Next() 不执行下一个 handler?检查是否提前写了响应
ctx.Next() 不是“继续往下走”,而是把控制权交还给 Fiber 的调度器——它是否继续执行后续 handler,取决于当前 handler 是否已写入响应。
- 如果你在中间件里调了
c.Status(401).SendString("unauthorized"),Fiber 就认为响应已完成,Next()后也不会进后续 handler - 权限校验失败时,应该直接返回错误(如
return c.Status(401).Send()),而不是调Next()后再 return - 调试技巧:每个中间件开头加
log.Printf("→ %s", "name"),结尾加log.Printf("← %s", "name"),一眼看出哪一层卡住了 - 别在中间件里反复调
Next(),这不会形成循环,但会让逻辑难以追踪
fiber.New() vs fiber.Default():生产环境必须自己选
fiber.Default() 自动挂载 Logger、Recover、RequestID,省事但有代价。
立即学习“go语言免费学习笔记(深入)”;
-
Logger默认打印完整请求头,Authorization、Cookie都可能被记进日志——上线前必须禁用或替换为脱敏版本 - 微服务场景下,
fiber.New(&fiber.Config{})更合适:只加Compress、JWT验证等必要中间件,避免默认集合拖慢延迟 - 本地快速验证接口逻辑时,
fiber.Default()确实快;但只要涉及任何真实部署,就得切回New()并手动注册中间件 - 中间件顺序很重要:比如
JWT必须在Logger之后注册,否则日志里看不到 token 验证结果;而Recover应该放在最外层
*fiber.Ctx 实例。一旦某个中间件修改了 c.Path 或 c.Method,后续中间件和 handler 看到的就是改过的值——这不是 bug,是设计使然,但很少有人意识到它会影响 Next() 行为和路由判断。


















