app.Use注册中间件必须指定路径前缀以避免误匹配所有请求;非法请求拦截需显式返回响应并终止流程;路径匹配遵循斜杠边界规则;中间件顺序影响执行时机,鉴权类应前置;Use对所有HTTP方法生效,需在内部判断请求方法。

app.Use注册中间件必须带路径前缀
不写前缀的 app.Use(middleware) 会匹配所有请求,包括静态资源、健康检查等非业务路径——这容易导致中间件误判或性能浪费。实际项目中应始终指定明确前缀,比如只对 /api 下的请求做校验:
app.Use("/api", jwtAuthMiddleware, rateLimitMiddleware)这样既保证作用域可控,也避免干扰 /health 或 /static 等路径。
非法请求拦截要区分「拒绝」和「跳过」逻辑
中间件里不能只靠 return 结束流程,必须显式调用 c.Status().SendString() 或 c.JSON() 并立即返回,否则 Fiber 会继续执行后续中间件甚至路由处理器。
- 错误写法:
if !isValid(c) { return }—— 请求仍会往下走 - 正确写法:
if !isValid(c) { c.Status(400).SendString("invalid request"); return } - 若需放行但跳过后续中间件(如白名单IP),用
c.Next()替代return
next('route'),跳过当前中间件链只能靠条件分支控制是否调用 c.Next()。
路径前缀匹配边界影响过滤范围
app.Use("/user") 会匹配 /user、/user/、/user/profile,但不会匹配 /users 或 /user-id。这是由 Fiber 的「斜杠边界」规则决定的,不是模糊子串匹配。
- 想覆盖更广路径,用
app.Use("/user/")(结尾带斜杠)更安全,它强制要求路径以/user/开头 - 想精确锁定某一层,比如只拦
/admin不拦/admin/logs,得改用app.Get("/admin", ...)配合单独处理,Use天然不具备这种粒度 - 通配符如
/user/*在Use中不生效,那是Get/Post路由才支持的语法
中间件顺序决定过滤时机
Fiber 中间件按注册顺序依次执行,非法请求应在早期就被截断,否则可能触发无意义的后续处理(如数据库查询、日志写入)。
- 把鉴权、参数校验类中间件放在最前面
- 避免把耗时操作(如 JWT 解析 + Redis 查询)放在日志中间件之后——万一请求非法,日志已打,但业务逻辑还没拦住
- 多个
Use调用之间也遵循注册顺序,app.Use("/api", a); app.Use("/api/v1", b)中,a总是先于b执行
Use 注册后会复制到所有 HTTP 方法栈,所以一个非法 POST 请求,也会触发你在 Use 里写的 GET 相关校验逻辑——这不是 bug,是设计使然,得在中间件内部自己判断 c.Method()。


















