必须显式注册JSON中间件、合理配置数据库连接池、校验路径参数类型、手动管理事务提交与回滚。四者缺一将导致解析失败、连接耗尽、SQL错误或事务卡死。

用 fiber.New() 初始化时必须显式注册中间件处理 JSON
默认的 Fiber 应用不自动解析请求体,ctx.Body() 拿到的是原始字节流,直接解码结构体必失败。常见错误是 POST/PUT 请求返回空数据或 json: cannot unmarshal object into Go value of type string。
必须在初始化后加 app.Use(fiber.json())(Fiber v2)或 app.Use(fiber.NewJSONParser())(v3+),否则所有写操作都拿不到参数。
- v2 写法:
app := fiber.New(); app.Use(fiber.JSON()) - v3 写法:
app := fiber.New(); app.Use(fiber.NewJSONParser()) - 若混用
form-data或x-www-form-urlencoded,还需额外加app.Use(fiber.NewFormParser())
database/sql 连接池设置不当会导致高并发下连接耗尽
Fiber 本身不管理数据库连接,全靠 sql.DB 的 SetMaxOpenConns 和 SetMaxIdleConns 控制。没设或设太小,压测时会出现 dial tcp: i/o timeout 或 too many connections。
典型配置应匹配实际负载:
立即学习“go语言免费学习笔记(深入)”;
-
db.SetMaxOpenConns(20):避免单机 DB 连接数爆满(MySQL 默认 151) -
db.SetMaxIdleConns(10):减少频繁建连开销 -
db.SetConnMaxLifetime(30 * time.Minute):防止连接被中间件或 DB 主动断开后复用失效
别把 db 当局部变量传进 handler——必须全局复用同一个 *sql.DB 实例。
CRUD 路由里别直接用 ctx.Params("id") 做整型转换
Fiber 的 ctx.Params() 返回字符串,常见错误是写 id, _ := strconv.Atoi(c.Params("id")) 然后直接查库,结果传入非法值(如 /user/abc)导致 SQL 报错或空结果,还可能引发 panic。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
正确做法是校验 + 明确错误响应:
- 用
id, err := strconv.ParseInt(c.Params("id"), 10, 64),检查err != nil - 查不到记录时,统一返回
c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "not found"}) - 不要用
panic()或忽略 err —— Fiber 不会自动 recover,会导致整个服务 crash
示例片段:
app.Get("/user/:id", func(c *fiber.Ctx) error {
id, err := strconv.ParseInt(c.Params("id"), 10, 64)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"})
}
var user User
err = db.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(&user.ID, &user.Name)
if err == sql.ErrNoRows {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "user not found"})
}
return c.JSON(user)
})事务操作必须手动调用 tx.Commit() 或 tx.Rollback()
Fiber 不介入 DB 事务生命周期。写操作涉及多条语句(比如先插入主表再插入关联表)时,若只开 tx, _ := db.Begin() 却忘了 defer tx.Rollback() 或最终 tx.Commit(),事务会一直挂起,锁住行或表,后续请求卡死。
标准模式是:
- 入口处
tx, err := db.Begin(),立即检查 err - 所有
tx.Query/Exec都用tx对象,不是db - 成功路径末尾
tx.Commit() - 任何错误分支都走
tx.Rollback()(且不能忽略 rollback 的 err)
别依赖 defer 放在 handler 开头——如果逻辑提前 return,defer 可能不执行;最安全的是用显式 if-else 或闭包包裹。
实际跑通的关键不在框架语法多炫,而在 JSON 解析开关、连接池水位、参数类型校验、事务收口这四点。漏一个,上线后就容易凌晨三点被报警叫醒。

















