hero绑定路由必须在依赖注入注册完成后调用,否则因参数无法解析而panic;参数需按规则书写(如iris.context须在动态依赖前),返回值决定响应内容与状态码。

Hero 绑定路由方法必须在依赖注入容器注册完成之后调用,否则函数参数无法解析,直接 panic。
hero.Handler 为什么一调就 panic?
常见错误现象是:调用 hero.Handler(printFromTo) 后服务启动失败,报类似 cannot resolve dependency for parameter ... 的 panic。根本原因是 hero 在初始化阶段(服务器启动前)就尝试反射解析函数签名并绑定依赖,但此时你还没调用 app.Register 或 hero.Register 注册对应类型。
- 所有被 hero 函数参数引用的类型(如
*sql.DB、UserService、iris.Context)必须提前注册 -
hero.Register是全局注册,适用于静态依赖;若依赖需每次请求新建(如带iris.Context的 logger),必须用hero.Scoped - 注册顺序不能错:先
hero.Register/app.Register,再app.Get(..., hero.Handler(...))
hero 函数参数怎么写才有效?
hero 支持三类参数自动注入,但签名规则严格:
-
iris.Context:可选,位置任意,hero 能识别并传入当前上下文 - 已注册的静态依赖(如
*sql.DB):必须与hero.Register或app.Register中注册的类型完全一致(包括指针/值、是否为接口) - 动态依赖(每个请求新建):需用
hero.Scoped注册,且函数签名中该参数必须紧跟iris.Context,例如func(ctx iris.Context, l *Logger) string
错误示例:func(l *Logger, ctx iris.Context) string —— hero 不识别这种顺序,l 会注入失败。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
返回值怎么控制响应?
hero 函数不写 ctx.JSON() 或 ctx.StatusCode(),而是靠返回值语义驱动响应:
-
string→ 响应体,Content-Type 默认text/plain -
struct{}→ JSON 序列化,Content-Type 自动设为application/json -
int→ 状态码(如201),响应体为空 -
(string, int)→ 响应体 + 状态码(如"OK", 200) -
error→ 400 错误,error.Error()作为响应体 -
(struct{}, error)→ JSON 响应体 + 错误状态码(默认 500,可配合iris.StatusCode类型覆盖)
注意:error 返回值不会触发中间件的 ctx.Next() 跳过逻辑,它只是快捷设置错误响应。
和 MVC 控制器混用时的坑
hero 和 MVC 是两套独立机制,不能交叉使用依赖字段和 hero 参数:
- MVC 控制器的
DB *sql.DB `inject:""`字段依赖,只对mvc.Application.Handle()生效,对hero.Handler完全无效 - hero 函数里不能直接用控制器结构体方法(如
(*UserController).GetUsers),因为 hero 不处理方法接收者注入 - 如果想复用控制器逻辑,应把业务逻辑抽成独立函数,再由 hero.Handler 包装,例如:
hero.Handler(func(db *sql.DB) []User { return db.FindAll() })
最易忽略的一点:hero 函数里用到的任何自定义 struct,只要要 JSON 输出,就必须是导出字段(首字母大写),否则序列化为空对象。










