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}
}
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:
对比:*router.Group 行为正常
同文件 *router.Group 无论有无 middleware 始终创建新分组,不存在此问题:
建议修复
去掉 else return r 分支,让无 middleware 时也创建子路由组: