app.PrintRoutes() 仅在所有路由注册完成后、且非异步调用时才输出,否则因时机不当、竞态或group未展开而无显示;它不返回数据、不可过滤,生产环境应禁用。

app.PrintRoutes() 是唯一能直接拿到当前全部注册路由的方式,但它只输出到控制台,不返回数据结构,也不支持过滤或运行时增量更新——除非你主动调用 RebuildTree()。
为什么 PrintRoutes() 有时没输出?
常见错误是调用时机不对:它必须在所有 app.Get()、app.Post() 等注册操作完成后执行,且不能在 goroutine 中异步调用。
- 放在
fiber.New()之后、app.Listen()之前,但 handler 里还没执行到动态注册逻辑 → 控制台空 - 在某个请求的 handler 里新开 goroutine 调用
app.PrintRoutes()→ 可能竞态,路由表未就绪 - 误以为
app.Group("/api")本身会出现在列表里 → 实际只显示/api/users这类已展开的具体路径,group 前缀不单独列项
PrintRoutes() 和 EnablePrintRoutes 的区别
EnablePrintRoutes: true 只在启动时自动触发一次 PrintRoutes(),前提是 DisableStartupMessage 为 false(否则直接被忽略)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 它无法用于服务启动后的状态查询,改配置也无效
- 生产环境禁用:会把所有 API 路径树暴露在启动日志里,属于敏感信息泄露
- 输出格式是纯文本,无 JSON 或字段名,不适合程序解析
想程序化获取路由数据?别依赖 PrintRoutes()
Fiber 没提供公开的路由表访问接口。如果真需要结构化路由信息(比如做权限校验、文档生成),只能自己维护一份注册记录:
- 每次调用
app.Get("/path", h)时,同步写入一个sync.Map或atomic.Value存储的 map - 避免直接读
app.Router—— 它是私有字段,v3 版本中结构不稳定,且内部 radix tree 不对外暴露节点遍历能力 - 注意:动态增删后若用了
RebuildTree(),你的手动维护表也要同步更新,否则和实际路由不一致
真正容易被忽略的是:Fiber 的路由匹配完全基于构建好的 radix 树,而树一旦建好就只读;所谓“动态”只是往栈里推新条目再重建整棵树,这个过程开销大、非线程安全、且不能频繁触发——所以与其折腾运行时路由管理,不如把动态性移到 handler 内部用 c.Params() 或 c.Locals 分发。










