必须用fiber.new()而非fiber.default()——后者默认启用logger、recover、requestid中间件,导致敏感头泄露、ttfb增加0.3–0.8ms、i/o瓶颈;strictrouting为true时需显式注册或重定向处理尾斜杠路由。

fiber.New() 初始化,别碰 fiber.Default() ——后者自带日志和恢复中间件,上线即埋雷。
初始化项目前先确认 Go 版本和模块
Fiber v2 要求 Go ≥ 1.19,v3 要求 Go ≥ 1.24。当前稳定生产环境推荐用 v2(截至 2026 年 10 月,v3 仍属测试阶段)。
执行以下命令创建模块并拉取依赖:
go mod init myapp go get github.com/gofiber/fiber/v2
注意:go get -u 不必要,反而可能意外升级到不兼容的次版本;显式指定 /v2 可避免模块解析错误。
为什么必须用 fiber.New() 而不是 fiber.Default()
fiber.Default() 是开发快捷入口,但默认启用 logger、recover 和 requestid 中间件。上线后每秒数百请求会把完整请求头(含 Authorization)打满磁盘,I/O 成瓶颈,实测 TTFB 增加 0.3–0.8ms。
正确做法是:
- 开发阶段可用
fiber.Default()快速验证逻辑 - 上线前必须切换为
fiber.New(),再按需手动注册中间件 - 如需日志,用采样式中间件(比如只记录
4xx/5xx)或对接zerolog等结构化日志库
StrictRouting 导致 /users 和 /users/ 都 404?
Fiber 默认开启 StrictRouting: true,这意味着 /users 和 /users/ 是两条完全独立的路由。你只注册了 app.Get("/users", ...),访问 /users/ 就必然 404。
错误解法是全局关掉:fiber.New(&fiber.Config{StrictRouting: false}) —— 这会导致路径匹配歧义,比如同时有 /users 和 /users/:id 时,/users/123 可能被前者捕获,c.Params("id") 拿不到值。
推荐方案:
- 显式注册两种路径:
app.Get("/users", ...)和app.Get("/users/", ...) - 或加一层重定向中间件,把结尾带斜杠的请求 301 跳转到无斜杠版本
- RESTful 设计中,统一约定是否带尾部斜杠,并在 API 文档里写死
ctx.Next() 的真实行为和常见误用
ctx.Next() 不是“继续执行下一个中间件”,而是把控制权交还给 Fiber 调度器——它是否继续往下走,取决于当前 handler 是否已写入响应。
典型翻车场景:
- 权限中间件里判断失败后调了
c.Status(401).Send("unauthorized"),紧接着又写ctx.Next()—— 此时响应头+体已发出,Fiber 直接终止链路,后续所有 handler 都不会进 - 正确做法:拒绝请求就直接
return,放行才调ctx.Next() - 调试时可在每个中间件开头加
log.Println("in auth middleware"),看执行流卡在哪一环
fiber.Ctx 是复用的,所有返回值(如 c.Params("id"))只在当前 handler 生命周期内有效;一旦离开 handler,引用可能指向脏数据。这点比 Express 更敏感,也更容易在异步 goroutine 中踩坑。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











