go fiber 需手动初始化关键中间件、严格校验参数、统一错误响应、配置超时与连接限制。必须显式添加 logger、recover、cors、json 等中间件;参数需类型转换与默认值处理;错误须主动返回 json 结构;生产环境需限制请求体、设置读写超时、安全使用 context。

Go Fiber 能快速搭出生产可用的 REST 服务,但默认不带 JSON 校验、中间件顺序错乱、路由参数类型松散——这些地方不提前踩坑,上线后会反复 debug。
如何正确初始化 Fiber 应用并启用关键中间件
Fiber 默认不启用任何中间件,app.Use(logger.New()) 和 app.Use(recover.New()) 必须手动加,否则 500 错误静默失败,日志全无。JSON 解析也得显式开启:app.Use(cors.New()) 要放在路由注册前,否则跨域头不生效。
-
app := fiber.New(fiber.Config{DisableStartupMessage: true})—— 关闭启动 banner,避免干扰容器日志 - 必须在
app.Get("/api/...")前调用app.Use(fiberjson.New())(需引入github.com/gofiber/fiber/v2/middleware/json),否则c.Body()返回原始字节,c.JSON()无法自动序列化结构体字段 -
app.Use(rate.New(rate.Config{Next: func(c *fiber.Ctx) bool { return c.IP() == "127.0.0.1" }}))—— 条件跳过限流,本地调试时别被自己封掉
如何安全解析和校验请求参数(Query / Params / Body)
Fiber 的 c.Params("id") 和 c.Query("page") 返回字符串,不做类型转换;c.Body() 是 []byte,直接传给 json.Unmarshal 容易 panic。别依赖反射自动绑定,手写校验更可控。
- 路径参数强制转整型:
if id, err := strconv.Atoi(c.Params("id")); err != nil { c.Status(fiber.StatusBadRequest).SendString("invalid id") } - Query 参数设默认值:
page := c.QueryInt("page", 1)——c.QueryInt比strconv.Atoi(c.Query("page"))更安全,空值或非法值自动回退 - Body 解析用
jsoniter.Unmarshal替代标准库(兼容 NaN/Infinity 等边界值),并立即检查err != nil,别等后续逻辑才报错
如何处理错误并统一返回 JSON 结构
Fiber 没有全局 error handler,panic 会被 recover 捕获但只返回空响应。必须为每个路由手动包装错误分支,或用自定义中间件拦截 c.Locals("err")。
- 约定返回结构:
type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data,omitempty"` } - 在业务 handler 结尾统一处理:
if err != nil { c.Status(fiber.StatusInternalServerError).JSON(Response{Code: 500, Msg: "server error"}) } - 不要用
defer func() { if r := recover(); r != nil { ... } }()全局兜底——它捕获不到 goroutine 内部 panic,且掩盖真实调用栈
如何配置生产环境的超时与连接限制
默认配置下,Fiber 会接受任意长的请求体、无限期等待慢客户端,容易被恶意请求拖垮。HTTP/2 支持需额外设置 TLS,否则 h2c 升级失败。
- 限制请求体大小:
app.Use(func(c *fiber.Ctx) error { if c.Request().Header.ContentLength() > 2*1024*1024 { return fiber.ErrRequestEntityTooLarge } return c.Next() }) - 设置读写超时:
fiber.New(fiber.Config{ReadTimeout: 10 * time.Second, WriteTimeout: 30 * time.Second}) - 启用 HTTP/2 需用
app.Listener(ln)+ 自定义http2.Server,直接app.Listen()只支持 HTTP/1.1
最常被忽略的是:Fiber 的 c.Context() 返回的是标准库 context.Context,但它的生命周期只到 handler 返回为止,不能直接传给异步 goroutine——要复制一个带超时的新 context,否则可能访问已释放的内存。











