fiber.logger() 默认只记录非2xx状态码请求且不输出敏感字段,开发调试需手动配置格式并确保注册顺序靠前。

fiber.Logger() 为什么日志没打出来
因为 fiber.Logger() 默认只记录状态码非 2xx 的请求,且不输出请求头、body 等敏感字段——它不是全量日志中间件。开发调试时想看完整请求流,得手动配置格式:
- 用
fiber.New()初始化 app,而非fiber.Default()(后者默认开启不安全日志) - 显式注册:
app.Use(fiber.Logger("[${time}] ${status} - ${method} ${path}")) - 别把它放在
app.Use(authMW)后面:认证失败直接c.Status(401).Send()并return,logger 就收不到请求了
fiber.Recover() 捕获 panic 却返回 500 页面
这是预期行为:fiber.Recover() 只负责拦截 panic、防止服务崩溃,但不接管错误响应体。它默认返回纯文本 "Internal Server Error",不会渲染 HTML 或 JSON。
- 如需自定义错误页,必须传入回调函数:
fiber.Recover(func(c *fiber.Ctx) error { return c.Status(500).JSON(fiber.Map{"error": "server crashed"}) }) - 别和
fiber.ErrorHandler混用——Fiber v3 不再提供全局ErrorHandler配置,错误处理要靠中间件或 handler 内if err != nil分支显式处理 - 注意:recover 中间件必须在所有路由 handler 之前注册(
app.Use()调用顺序靠前),否则 panic 发生在它之后的中间件里,就捕获不到了
cors.New() 配置后 OPTIONS 请求仍 405
根本原因是 cors.New() 默认只允许 GET 和 HEAD 方法,而预检(OPTIONS)请求需要明确声明支持的动词列表。浏览器发 OPTIONS 前,会先检查服务端是否允许后续主请求的方法。
- 必须显式设置
AllowMethods:比如前端用PUT,就得写cors.Config{AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}} -
AllowOrigins不能是空字符串或"*"(尤其启用AllowCredentials: true时),应填具体域名切片:[]string{"https://myapp.com"} - 别漏
AllowHeaders:若前端带X-Auth-Token,这里就得列出来,"*"不被规范支持
中间件里读 body 为什么第二次就空了
c.Body() 返回的是已读取并缓存的字节切片,但底层 fasthttp 的 body 是单次读取的 io.ReadCloser。第一次调用后,原始流已被消费,再次调 c.Body() 会返回空或旧缓存值。
- 需要多次使用 body 时,应在首次读取后存入
c.Locals:c.Locals["raw_body"] = c.Body() - 若要解析 JSON,直接用
c.BodyParser(&v),它内部已做一次读取;不要再先c.Body()再手动json.Unmarshal - 绝对不要在中间件里反复调
c.FormValue()或c.MultipartForm()——它们也会触发 body 消费,导致后续解析失败
Fiber 的“内置中间件”本质就是预设好的 func(*fiber.Ctx) error 函数,没有魔法,也没有自动注入逻辑。最容易被忽略的是:它们全部依赖你调用顺序和是否显式 return,而不是框架帮你兜底。











