Skip to content

routeGroup.Group 无 middleware 时路由前缀丢失 #81

@skeletongo

Description

@skeletongo

routeGroup.Group 在不传 middleware 时直接 return r,没有调用 r.router.Group(prefix) 创建新的 fiber 子路由组,导致传入的 prefix 被静默丢弃。

影响

userGroup := proxy.Router().Group("/user", authMiddleware) // routeGroup
bagGroup := userGroup.Group("/bag") // 预期创建 /user/bag 子组
bagGroup.Post("/get_info", handler) // 预期注册到 /user/bag/get_info

bagGroup 实际就是 userGroup 本身,所以 bagGroup.Post("/get_info", handler) 注册到了 /user/get_info,而非预期的 /user/bag/get_info。

请求 /user/bag/get_info 时会命中父分组的中间件链但没有 handler,返回 200 + 空 body,调试极其困难。

根因代码

router.go routeGroup.Group:

 func (r *routeGroup) Group(prefix string, middlewares ...any) Router {
     if len(middlewares) > 0 {
         // ... 转换 middleware ...
         return &routeGroup{router: r.router.Group(prefix, middlewares...), proxy: r.proxy}
     }

     return r   // ← Bug: 无 middleware 时直接返回自己,prefix 被丢弃
 }

对比:*router.Group 行为正常

同文件 *router.Group 无论有无 middleware 始终创建新分组,不存在此问题:

 func (r *router) Group(prefix string, middlewares ...any) Router {
     handlers := make([]any, 0, len(middlewares))
     // ... 转换 ...
     return &routeGroup{proxy: r.proxy, router: r.app.Group(prefix, handlers...)}
 }

建议修复

去掉 else return r 分支,让无 middleware 时也创建子路由组:

 func (r *routeGroup) Group(prefix string, middlewares ...any) Router {
     if len(middlewares) > 0 {
         for i := range middlewares {
             switch h := middlewares[i].(type) {
             case fiber.Handler:
                 continue
             case Handler:
                 middlewares[i] = func(ctx fiber.Ctx) error {
                     return h(&context{Ctx: ctx, proxy: r.proxy})
                 }
             }
         }
     }
     return &routeGroup{router: r.router.Group(prefix, middlewares...), proxy: r.proxy}
 }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions