app.Routes().All() 是 Iris 中获取全部已注册路由的最直接方式,返回包含路径、方法、处理器名等元数据的切片,须在 app.Listen() 前调用且需检查非空,Group 子路由需完成有效注册才可见。

使用 app.Routes().All() 获取全部路由信息
在 Iris 中,app.Routes().All() 是最直接、最可靠的方式获取当前已注册的所有路由。它返回一个 []*iris.Route 切片,每个元素包含路径、方法、处理函数名、中间件等完整元数据。
注意:该方法只返回「已注册」的路由,不包括运行时动态添加但尚未被 Iris 内部注册的(比如绕过 Get/Post 等方法、直接操作底层路由表的情况)。
- 必须在
app.Listen()或app.Run()之前调用,否则部分内部结构可能未完全初始化 - 返回的
*iris.Route结构体中,Route.Path是带前缀的完整路径(含app.RegisterView等注册的静态路由前缀) -
Route.HandlerName是处理函数的原始名称(如"main.homeHandler"),不是匿名函数的空字符串 —— 匿名函数会显示为"func1"这类编译器生成名
打印路由列表时如何避免 panic 和空输出
常见错误是直接遍历 app.Routes().All() 却没检查是否为空,或在 app.ConfigureContainer 阶段过早调用导致 nil panic。Iris 的路由表在应用启动流程中分阶段构建,早期访问可能返回空切片或未初始化字段。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 确保调用位置在
app.Use/app.Get等注册逻辑之后、app.Listen()之前 - 加一层空值判断:
if routes := app.Routes().All(); len(routes) > 0 { ... } - 避免在
app.ConfigureContainer回调里调用 —— 此时路由注册尚未开始,All()返回空切片且Route.Method可能为 nil - 若需调试,建议封装成中间件,在第一个请求进来时打印一次并
os.Exit(1)终止,防止重复刷屏
查看路由时为什么看不到 Group 子路由?
Iris 的 app.Party(即 Group)注册的路由默认会合并进主路由表,app.Routes().All() 能正常列出所有子路由 —— 前提是 Group 已被“挂载”。容易忽略的是:仅创建 party := app.Party("/admin") 并注册了 party.Get("/users", handler),但没调用 party.Done() 或后续任何注册动作,Iris 不会将其加入全局路由表。
- Group 必须至少完成一次有效注册(如
Get、Use、Done())才会被纳入All()结果 - 如果用了
party := app.Party("/v1").DisablePathCorrection()这类配置,但没再调用Get,该 Group 也不会出现在结果中 - 可通过
len(app.Routes().All())对比添加 Group 前后数值变化,快速验证是否生效
生产环境别用 Routes().All() 实时导出路由
虽然技术上可行,但 app.Routes().All() 每次调用都会复制整个路由切片,且内部涉及反射读取 handler 名称,在高并发下有轻微性能开销。更严重的是,它暴露了处理函数名、中间件栈、甚至闭包捕获的变量名(通过 HandlerName 可间接推测)。
- 开发期调试用没问题;上线后应移除相关代码,或用环境变量控制是否启用(如
if os.Getenv("DEBUG_ROUTES") == "1" { ... }) - 不要把
Route.Handler直接序列化返回给前端 —— 它是http.HandlerFunc类型,JSON 序列化会 panic - 若需 API 文档,优先用第三方工具(如
swag+ 注释)而非运行时反射路由表
路由信息本身不复杂,但 Iris 的注册时机和 Group 挂载机制会让初学者误以为“写了就没生效”。关键就两点:确认注册语句确实执行了,且调用 All() 的位置在所有注册之后、启动之前。










