上线必须用fiber.New()而非fiber.Default(),因后者默认启用Logger、Recover、RequestID中间件,导致敏感信息泄露、TTFB增加0.3–0.8ms;StrictRouting使/users与/users/视为不同路径而404,应显式注册或重定向;QueryParam、Params、FormValue来源互异,混用必空;ctx.Next()是否继续执行仅取决于是否已写响应。

上线服务必须用 fiber.New() 初始化,别碰 fiber.Default();路由参数、查询参数、表单值三者来源互不重叠,混用必空;ctx.Next() 是否继续执行,只取决于你有没有写响应。
为什么 fiber.Default() 不能上生产
它默认挂了 Logger、Recover、RequestID 三个中间件,每秒把完整请求(含 Authorization、Cookie)打到日志里,敏感信息直接泄露。TTFB 多出 0.3–0.8ms,高并发下连接池和 I/O 被拖垮——不是框架慢,是初始化错了。
- 开发阶段用
fiber.Default()没问题,快速验证逻辑 - 上线前必须切到
fiber.New(),再按需加中间件(比如只在 error 时记日志) - 真要日志,别用
fiber.Logger(),改用采样式记录或对接结构化日志系统
/users 和 /users/ 为什么一个 404 一个正常
Fiber 默认开启 StrictRouting: true,把两者视为完全不同的路径。你只注册了 app.Get("/users", handler),那访问 /users/ 就必然 404。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 别无脑关掉
StrictRouting:设成false后,/users/123可能被/users匹配,c.Params("id")拿不到值 - 推荐显式注册两条路由:
app.Get("/users", handler)和app.Get("/users/", redirectHandler) - 或加统一重定向中间件:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) }
ctx.QueryParam、ctx.Params、ctx.FormValue 到底读哪来的
三者来源完全不同,混用就是空值,不是 bug 是误用。
-
c.QueryParam("q")只读 URL query string,比如/search?q=go中的q -
c.Params("id")只读路由占位符,比如app.Get("/user/:id", )匹配/user/123后的123 -
c.FormValue("name")是给application/x-www-form-urlencoded准备的;JSON body 必须用c.Body()+json.Unmarshal或c.Struct(&v)
ctx.Next() 为什么没进下一个 handler
ctx.Next() 不是“继续往下走”,而是把控制权交还给 Fiber 调度器——它是否继续执行后续 handler,取决于当前 handler 是否已写入响应。
- 权限中间件里判断失败后写了
c.Status(401).Send("unauthorized"),Fiber 就认为响应已完成,Next()后也不会进后续 handler - 校验失败应直接返回错误:
return c.Status(401).Send(),而不是调Next()再 return - 注意
c.Send()、c.JSON()、c.Status(401).Send()都算“已写响应”
最常被忽略的是:Ctx 是从 sync.Pool 复用的对象,不能把它传给会开 goroutine 的库——那个 goroutine 返回时,c 可能已被归还并复用于其他请求,数据错乱。


















