fiber 必须显式调用 app.listen() 启动服务器,且路由注册需在 listen 前完成;new() 仅创建未运行实例,忽略错误或顺序错会导致静默失败或 404。

直接用 fiber.New() 初始化,配好路由再调用 app.Listen() 就能跑起来——不需要配置文件、不依赖模板引擎、不强制分层结构,5 行代码以内就能响应 HTTP 请求。
初始化和监听端口必须显式调用 app.Listen()
Fiber 不会自动启动服务器,fiber.New() 只返回一个未运行的 *fiber.App 实例。漏掉 app.Listen() 或忘了 log.Fatal() 包裹,程序会静默退出,没有任何错误提示。
-
app.Listen(":3000")返回error,不检查就忽略会导致服务根本没起来但进程已结束 - 端口被占用时,
app.Listen()会返回类似listen tcp :3000: bind: address already in use的错误,不是 panic,得靠log.Fatal()捕获并终止进程 - 如果想用 Unix socket 或自定义 listener(比如复用 net.Listener),得用
app.Listener(lis),而不是Listen()
路由注册必须在 app.Listen() 之前完成
Fiber 的路由树在首次 app.Listen() 时才固化,之后调用 app.Get() 等方法不会生效——这点和 Gin 不同,Gin 允许热注册,Fiber 不行。
- 常见错误:把
app.Get("/health", ...)写在app.Listen()后面,请求永远 404 - 动态路由(如带参数的
/users/:id)必须用c.Params("id")取值,不能用c.Query("id")——后者是 URL 查询参数,不是路径参数 - 通配符路由
/api/*要放在具体路由之后,否则会提前匹配,导致/api/users和/api/posts都落到同一个 handler
中间件顺序决定执行流,c.Next() 是关键开关
Fiber 中间件不是“装饰器”,而是靠 c.Next() 显式控制是否继续后续 handler。忘记写或写错位置,会导致链路中断或重复执行。
- 全局中间件(
app.Use(fn))对所有路由生效;前缀中间件(app.Use("/api", fn))只匹配路径前缀 -
c.Next()必须在 handler 结尾前调用,否则后续 handler 不会执行;若 handler 提前return(如鉴权失败直接c.Status(401).Send()),就不要调c.Next() - 中间件里不能直接修改
c.Response().Body(),因为 FastHTTP 复用底层 buffer,应统一用c.SendXXX()方法
最易被忽略的是:Fiber 基于 fasthttp,它不兼容 net/http 生态——你不能把 Gin 的中间件、Swagger 文档生成器、gqlgen GraphQL 服务直接套过来用,连 http.HandlerFunc 类型都不能直接转。选 Fiber 就得接受它是独立生态,不是 “Go 版 Express” 的语法糖,而是性能取舍后的另一套契约。











