Fiber项目不能直接go run main.go完事,因其无热重载机制,每次代码变更需手动重启;实际开发应使用Air等工具实现自动编译重启,且需确保在含go.mod的根目录运行并正确配置监听路径。

初始化 Fiber 项目时为什么不能直接 go run main.go 就完事?
Fiber 本身不带热重载或开发服务器,go run main.go 能跑通但改代码必须手动重启。实际开发中建议用 air 或 fresh,比如安装 air:
go install github.com/cosmtrek/air@latest,然后在项目根目录执行
air。注意 air 默认监听 main.go,如果入口文件名不同(如 app.go),需配 .air.toml 指定 root_dir = "." 和 main_package = "."。
fiber.New() 后必须立刻配置 Logger 和 Recover 吗?
不是“必须”,但跳过会导致线上出错时无日志、panic 直接崩进程。生产环境几乎一定会加:
app := fiber.New(fiber.Config{
ErrorHandler: func(c *fiber.Ctx, err error) error {
log.Printf("HTTP error: %v", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "server error"})
},
})Logger 中间件建议只在非测试环境启用,否则日志刷屏干扰调试;Recover 建议始终开启,它捕获 panic 并转成 500 响应,避免连接被意外关闭。
路由参数和查询参数混用时,c.Params() 和 c.Query() 容易搞反
常见错误是把 URL /users/123?role=admin 中的 123 当作查询参数去取,结果 c.Query("id") 返回空。正确方式:
- 路由定义要显式声明参数:
app.Get("/users/:id", handler) - 取路径参数用
c.Params("id")(返回字符串) - 取查询参数用
c.Query("role")(支持默认值:c.Query("role", "user")) - 若需强类型转换,别直接用
strconv.Atoi(c.Params("id")),先检查是否为空,再处理错误
返回 JSON 时为什么 c.JSON(200, data) 有时不生效?
最常见三个原因:
-
data是 nil 指针且结构体字段没加json:tag,导致序列化为空对象或 panic - 中间件提前写了响应(比如鉴权中间件调了
c.Status(401).SendString()),后续c.JSON()会报cannot write header after body - 使用了
ctx.Next()但没控制流程,多个 handler 都尝试写响应
建议统一用封装函数:func sendJSON(c *fiber.Ctx, status int, v interface{}) error { c.Set("Content-Type", "application/json; charset=utf-8") return c.Status(status).JSON(v) }
这样能确保 Content-Type 正确,也方便后期加日志或埋点。
Fiber 的轻量带来快感,但也意味着很多边界行为得自己兜底——比如超时控制要靠 Timeout 中间件,文件上传限制得手动配 BodyLimit,跨域不能只靠 CORS() 默认配置,这些都不是“开箱即用”的部分。


















