必须启用iris.LogDebug级别日志,否则app.GetRoutes()输出为空或不完整;LogDebug可打印完整路由树、中间件链及HTTP方法绑定,且需在app.Listen()前调用。

调试前必须启用 LogDebug 级别日志
不打开 debug 日志,app.GetRoutes() 输出的路由表是空的或不完整,你根本看不到实际注册了哪些路径和方法。启动服务前加这一行:iris.Logger().SetLevel(iris.LogDebug),否则所有后续调试动作都失去依据。
- LogDebug 会打印完整的路由树、中间件链、HTTP 方法绑定关系,包括嵌套路由前缀是否生效
- 若只用
iris.Logger().SetLevel(iris.LogInfo),你只会看到“Now listening on...”,什么也查不到 - 日志里出现
UNKNOWN方法,大概率是你用了app.Handle而非app.Get/app.Post
用 app.GetRoutes() 打印所有已注册路由
app.GetRoutes() 是 Iris 唯一可靠的路由自查手段,它返回 []Route 切片,可直接遍历打印或 JSON 序列化。别信文档里写的“自动映射”或自己脑补的路径——只有它显示的才是真实生效的。
- 在
app.Run()前调用,例如:fmt.Printf("%+v\n", app.GetRoutes()) - 重点检查
Subdomain、Path、Method和Handlers字段,确认嵌套路由前缀(如/api/v1)是否被正确拼接 - 如果某条路由的
Method是UNKNOWN,说明你用了app.Handle("GET", ...),应改用app.Get - 路径参数写成
:id的路由,Path字段会显示为/users/:id;若显示为/users/{id},说明你写错了格式
路径参数和查询参数取值错误导致 404 或空值
调试时发现 ctx.Param("id") 返回空字符串,或 ctx.URLParam("page") 拿不到值,不是框架 bug,而是参数来源和读取方式错配。
-
ctx.Param("id")只能取路径段,比如请求GET /users/123对应路由app.Get("/users/:id", h),才有效 -
ctx.URLParam("page")只能取 URL 查询参数,比如GET /users?page=2,不能用于路径段 - 误用
ctx.Param("page")必然返回空,因为路由里没定义:page - 对数字型参数,优先用
ctx.Params().GetInt64("id")(返回(int64, error)),别用GetInt(返回(int, bool)),后者无法区分「取不到」和「转失败」
OPTIONS 预检失败时先查是否注册了 OPTIONS 路由
CORS 预检请求失败,90% 的原因是压根没注册 OPTIONS 路由,而不是中间件写得不对。Iris 不会自动响应 OPTIONS,必须显式注册。
- 错误做法:
app.Use(corsMiddleware)后就以为万事大吉 → 浏览器发 OPTIONS 请求,直接 404 - 正确做法:对 API 前缀显式注册,例如
app.Options("/api/*", corsHandler)或更宽泛的app.Any("/*path", corsHandler) -
app.Any是真正注册了一条路由,能响应所有方法(含 OPTIONS),而app.Use只是挂载中间件,不创建路由 - 调试时用
curl -X OPTIONS http://localhost:8080/api/users -v看响应头是否包含Access-Control-Allow-Methods,没有就说明 OPTIONS 路由没生效
LogDebug → 运行看启动日志 → 调 app.GetRoutes() 确认注册内容 → 用 curl 模拟请求并比对参数读取方式。最容易被忽略的是 app.Options 的显式注册和 ctx.Param 与 ctx.URLParam 的严格分工。


















