fiber.new()是唯一推荐的初始化方式,fiber.default()仅用于本地验证;fiber v2需go≥1.21、v3需go≥1.24;app.listen()必须检查error;strictrouting默认开启导致路径匹配严格;响应需正确设置content-type和状态码。

fiber.New() 是你唯一该用的初始化方式,fiber.Default() 仅限本地快速验证,上线前必须替换。
Go 版本不匹配会导致 go get 静默失败
Fiber v2 要求 Go ≥ 1.21,v3 要求 Go ≥ 1.24。运行 go version 检查当前版本;若低于要求,go get 可能拉取旧版或直接跳过——不会报错,但后续编译会卡在 import 路径不匹配。
升级 Go 推荐用官方下载器:go install golang.org/dl/go1.24@latest → go1.24 download。别依赖系统包管理器,容易版本滞后。
安装命令按场景选:
- 生产项目:用
go get github.com/gofiber/fiber/v2 - 想试 v3:先升 Go 到 1.24+,再执行
go get github.com/gofiber/fiber/v3,且不能和 v2 混用 import 路径
app.Listen() 不处理错误,服务就“假启动”
常见现象:终端没报错、进程在跑,但 curl 或浏览器访问超时或连接被拒绝。根本原因是没检查 app.Listen(":3000") 返回的 error。
端口冲突时错误是 listen tcp :3000: bind: address already in use,不是 Fiber 特有,但新手常忽略。正确写法:
if err := app.Listen(":3000"); err != nil {
log.Fatal(err)
}
生产环境避免硬绑 1–1023 端口(如 :80),非 root 用户无法绑定;应由 Nginx 或 Caddy 做反向代理。
路由 404?大概率是 StrictRouting 在起作用
注册了 app.Get("/users", handler),但访问 /users/ 返回 404,不是代码错了,是 Fiber 默认开启 StrictRouting: true —— 它把 /users 和 /users/ 当作两个不同路径。
解决方案只有两个有效且安全的:
- 加中间件统一重定向:用
redirect.New(redirect.Config{Rules: map[string]string{"/users/": "/users"}}),把带斜杠的 301 跳转到无斜杠版 - 显式注册两种路径:同时写
app.Get("/users", handler)和app.Get("/users/", handler)
千万别全局关 StrictRouting: false。当存在 /users 和 /users/:id 时,/users/123 可能被前者匹配,c.Params("id") 拿不到值,问题更隐蔽。
响应内容类型不设对,前端就解析失败
用 c.SendString() 发 JSON 却不设 Content-Type,浏览器可能当纯文本渲染;用 c.SendFile() 发 HTML 却手动拼字符串,忘了设 MIME 类型,就会触发下载而不是渲染。
按用途选方法,别自己拼头:
- 纯文本:
c.SendString("ok")→ 自动设text/plain; charset=utf-8 - JSON:
c.JSON(fiber.Map{"code": 0})→ 自动设application/json; charset=utf-8 - HTML 文件:
c.SendFile("index.html")→ 自动推断 MIME;若用c.SendString()拼 HTML,必须先c.Set("Content-Type", "text/html; charset=utf-8") - 状态码要显式设:
c.Status(fiber.StatusNotFound).Send("not found"),否则默认 200
fiber.Ctx 的返回值(如 c.Params()、c.Body())默认可复用、不可跨 handler 保存引用。哪怕只是存个字符串,也得用 utils.CopyString() 或手动 copy() 缓冲区——这点在日志、异步任务、中间件透传时最容易漏。











