app.Group("/api").Group("/v1")不生效,因为Group返回的*fiber.Router不自动拼接前缀,v1.Get("/users", h)注册的是GET /users而非/api/v1/users;正确做法是显式在每个路由路径中写全量前缀,如v1 := app.Group("/api/v1"); v1.Get("/users", h)。

Fiber 没有“子路由模块”这个原生概念,所谓多级子路由,本质是通过 Group + 路径拼接 + 中间件隔离实现的组合策略,不是嵌套注册或自动前缀继承。
为什么 app.Group("/api").Group("/v1") 不生效?
Group 返回的是 *fiber.Router,它本身不修改路径匹配逻辑。你写:
api := app.Group("/api")
v1 := api.Group("/v1") // 这行代码其实没用
v1.Get("/users", h)
最终注册的路由是 GET /users,不是 /api/v1/users。因为 v1.Group("/v1") 只是新建了一个空路由节点,它不会把 /v1 自动拼到后续 Get 的路径上——Fiber 从不帮你补前缀。
常见错误现象:
- 请求
/api/v1/users返回 404 - 日志里看不到该路由被注册
-
app.Get("/api/v1/users", h)能工作,但和 Group 完全无关
正确做法只有一个:前缀必须显式出现在每个 Get/Post 的第一个参数里。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
怎么安全地组织 /api/v1 和 /api/v2 两套路由?
用变量统一管理前缀,避免硬编码散落:
- 定义常量或变量:
const apiV1 = "/api/v1"、const apiV2 = "/api/v2" - 分别创建 Group:
v1 := app.Group(apiV1)、v2 := app.Group(apiV2) - 注册时仍写全路径:
v1.Get("/users", getUsers)→ 匹配GET /api/v1/users - 不要写
v1.Get(apiV1+"/users", ...),会变成/api/v1/api/v1/users
这样既保持可读性,又防止重复拼接。如果未来要批量迁移版本,改一个变量即可。
能否在 Group 内再挂载另一个完整 Fiber 应用?
可以,但必须用 app.Use(prefix, subApp),不能用 Group。
Use 是唯一支持“挂载子应用”的机制,它会把整个 subApp 当作中间件处理,所有请求路径以 prefix 开头的都会透传给它:
adminApp := fiber.New()
adminApp.Get("/dashboard", dashboardHandler)
adminApp.Post("/users", createUser)
<p>app.Use("/admin", adminApp) // ✅ 正确:/admin/dashboard → 进入 adminApp
</p>
注意:
-
Use对所有 HTTP 方法生效(GET/POST/PUT 等),而Group只是路由分组工具 -
adminApp内部的Use中间件只对它自己生效,不会污染根应用 - 别用
app.Group("/admin").Use(adminApp),这会报类型错误:不能把*fiber.App当作fiber.Handler
真正容易被忽略的一点:Group 的中间件只对本组内显式注册的路由起作用,它不会“穿透”到你用 Use 挂载的子应用里。如果你希望权限控制同时覆盖 /api/v1 和 /admin,得分别在对应 Group 或 Use 调用中注册中间件,不能指望一次注册全局生效。










