唯一可靠方式是直接读取app.Stack,它按HTTP方法分组存储*fiber.Route指针数组,可获取Path、HandlerName、Handlers等信息,但不包含子应用内部路由或动态挂载的运行时路由。

直接读取 app.Stack 是唯一可靠方式
Fiber 没有内置的 app.Routes() 或 app.PrintRoutes() 这类调试方法。官方不提供运行时路由枚举 API,因为路由表在启动后被压缩、去重、扁平化,且部分结构(如中间件链)是闭包绑定的,无法安全序列化。真正能拿到原始注册信息的,只有未压缩前的 app.Stack —— 它是按 HTTP 方法分组的二维 slice,每个元素是 *fiber.Route 的指针数组。
app.Stack 里能看到什么、不能看到什么
你可以遍历 app.Stack["GET"]、app.Stack["POST"] 等键,拿到每条路由的 Path、HandlerName、Handlers(处理器函数名切片)、Params(参数名列表)。但注意:
-
Use注册的中间件会出现在所有方法栈中(比如app.Use("/api", ...)会同时出现在app.Stack["GET"]和app.Stack["POST"]),别误以为是重复注册 - 通配路径如
/users/:id的Path字段存的是原始字符串,不是匹配后的实际路径 - 子应用挂载(
app.Use("/admin", adminApp))的Handlers里只会显示"subapp",看不到子应用内部路由 —— 那部分要单独查adminApp.Stack -
HandlerName是函数名(如"main.homeHandler"),但如果用了匿名函数或闭包,它会是"main.func1"这类不可读名称
开发期快速打印路由的实操代码
加在 app.Listen() 前即可:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
for method, routes := range app.Stack {
for _, r := range routes {
fmt.Printf("%s %s → %s\n", method, r.Path, r.HandlerName)
}
}
输出类似:
GET /health → main.healthHandler USE /api → subapp POST /api/login → main.loginHandler GET /users/:id → main.getUser
注意:USE 行表示中间件挂载点,不是终结点;若你用 fiber.New(&fiber.Config{DisableStartupMessage: true}),这段打印不会干扰启动日志。
为什么不能依赖第三方路由查看工具
所有声称“一键导出路由树”的 CLI 工具或中间件,本质都是在启动前 hook app.register 函数,自己维护一份副本。它们无法反映 app.Use 动态挂载的子应用、运行时通过 app.Group() 新增的路由,更无法处理 ctx.Next() 触发的条件性跳转逻辑。最稳的方式,永远是直读 app.Stack —— 它就在内存里,没做任何隐藏,只是 Fiber 不把它包装成友好的 API 而已。


















