上线前必须用fiber.new()替代fiber.default(),因其默认中间件会泄露敏感日志、拖慢响应并掩盖panic;strictrouting应通过重定向处理尾斜杠而非关闭;ctx.next()是否执行后续handler取决于响应是否已发出;json解析需传地址,参数转换应优先用内置方法。

上线前不换 fiber.New(),性能和安全问题会直接暴露在生产环境。
为什么 fiber.Default() 不能上生产
fiber.Default() 自动挂了 Logger、Recover、RequestID 三个中间件,开发阶段省事,但上线后会出实际问题:
- 日志默认输出完整请求头,
Authorization、Cookie等敏感字段全打出来,安全扫描必告警 -
Logger每秒写几百条日志,I/O 成瓶颈,实测 TTFB 增加 0.3–0.8ms(4 核 8G 环境) - 中间件顺序不可控,比如
Recover被插在最外层,掩盖真实 panic 位置
正确做法是:开发用 fiber.Default(),上线前必须切到 fiber.New(),再按需手动加中间件——比如只在 error 场景写结构化日志,或用 zap 对接。
StrictRouting 导致 /users 和 /users/ 都 404 怎么办
Fiber 默认 StrictRouting: true,把结尾斜杠当作路径的一部分。你只注册了 app.Get("/users", handler),那 /users/ 就是另一个未定义路由,必然 404。
- 别全局关掉:
fiber.New(&fiber.Config{StrictRouting: false})—— 这会让/users/123可能被/users匹配,c.Params("id")拿不到值 - 推荐显式重定向:在
app.Use()里统一处理尾斜杠
app.Use(func(c fiber.Ctx) error {
path := c.Path()
if strings.HasSuffix(path, "/") && path != "/" {
return c.Redirect(strings.TrimSuffix(path, "/"), 301)
}
return c.Next()
})
注意:前端 SDK、OpenAPI 文档、测试脚本也得同步改成无尾斜杠调用,否则重定向只是兜底,不是根治。
ctx.Next() 不执行后续 handler 的真实原因
ctx.Next() 不是“继续往下走”,而是把控制权交还给 Fiber 调度器;它是否继续执行,取决于当前 handler 是否已写响应。
- 权限中间件里写了
c.Status(401).Send("unauthorized"),再调c.Next()—— 响应已发出,Fiber 直接终止链路 - 拒绝请求就直接
return,别碰ctx.Next();放行才调 - 调试时在每个中间件开头加
log.Println("in auth middleware"),看执行流卡在哪一环
常见翻车点:在 defer 里试图读 c.Response().StatusCode(),但此时 c 已被复用,值不可靠。
JSON 解析和参数取值的典型误用
Fiber 不自动解析 JSON 或转类型,所有解析动作都得显式触发,且类型必须对齐:
- 接收 JSON 必须传地址:
err := c.BodyParser(&user),写成c.BodyParser(user)(没 &)会导致解析静默失败,user保持零值 - 路径参数用
c.Params("id"),返回 string;想转 int 别用strconv.Atoi()(性能差),改用c.ParamsInt("id", 0) -
c.Query("page")和c.Params("id")完全不重叠:URL 是/users/123?page=2,前者拿"2",后者拿"123" -
c.Body()会拷贝字节,高吞吐下成瓶颈;改用c.BodyBytes()直接取底层引用(前提是你不修改内容)
最容易被忽略的是:c.Locals 不透传进原生 context.Context,要用 c.Context() 显式获取。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











