直接上手就能跑通:fiber.new()后调用app.get()等即可响应请求;但必须处理app.listen()返回的错误,避免端口占用导致静默失败;响应需匹配content-type,路由参数提取和strictrouting行为需特别注意。

直接上手就能跑通,不需要额外配置中间件或路由注册器——fiber.New() 初始化后调用 app.Get()、app.Post() 等方法即可响应请求。
初始化应用与启动监听
Fiber 启动极简,但端口绑定和错误处理容易被忽略。最常见问题是没捕获 app.Listen() 的返回错误,导致服务静默失败。
-
app.Listen(":3000")返回error,必须显式处理,推荐用log.Fatal()或自定义 panic 逻辑 - 若端口被占用,错误信息是
listen tcp :3000: bind: address already in use,不是 Fiber 特有,但新手常卡在这一步 - 生产环境别硬写
":80",Linux 下非 root 用户无法绑定 1–1023 端口;建议用反向代理(如 Nginx)转发
响应不同格式数据的正确写法
响应类型不匹配会导致前端解析失败,比如用 c.SendString() 发 JSON 却没设 Content-Type,浏览器可能当纯文本渲染。
- 发纯文本:
c.SendString("ok")—— 自动设text/plain; charset=utf-8 - 发 JSON:
c.JSON(fiber.Map{"code": 0, "msg": "success"})—— 自动设application/json; charset=utf-8,无需手动c.Set() - 发 HTML 文件:
c.SendFile("index.html")—— 自动推断 MIME 类型;若用c.SendString()拼 HTML,记得先c.Set("Content-Type", "text/html; charset=utf-8") - 状态码要显式设:
c.Status(fiber.StatusNotFound).Send("not found"),否则默认是 200
路由参数与路径匹配的坑
Fiber 路由语法像 Express,但参数提取和通配符行为有细节差异,尤其在嵌套路由或带点扩展名时易出错。
-
app.Get("/user/:id", ...)中,c.Params("id")取到的是字符串,需自行转int或校验格式 -
app.Get("/file/:name.:ext", ...)是合法的,c.Params("name")和c.Params("ext")会分别截取点号前后的部分 -
app.Get("/api/*", ...)匹配所有以/api/开头的路径,c.Params("*")返回完整子路径(如register),不是正则捕获组 - 注意路径结尾斜杠:
/users和/users/默认不等价,除非启用StrictRouting: false配置
静态文件与分组路由的实际组织方式
开发中常把 API 和静态资源混在一起,但 app.Static() 和 app.Group() 的作用域和优先级需要理清。
-
app.Static("/static", "./public")会劫持所有以/static/开头的请求,内部自动处理 404,无需额外路由 - 分组路由用
app.Group("/api")返回新fiber.Router,后续.Get()是相对路径,比如group.Get("/users")实际注册为/api/users - 分组可嵌套:
admin := app.Group("/admin"); users := admin.Group("/users")→/admin/users/:id - 静态路由注册顺序无关,但若自定义了同路径的
app.Get("/static/*"),它会覆盖app.Static(),因为显式路由优先级更高
真正要注意的是上下文生命周期:fiber.Ctx 对象在请求结束即失效,所有从 c 拿出的值(如 c.Query()、c.Body())都只在 handler 函数内有效;跨 goroutine 传 c 或缓存它的字段,大概率引发内存错误或脏数据。











