必须用go get github.com/kataras/iris/v12@latest安装主包,v12.2.5+已移除独立/middleware子模块;JWT等需手写逻辑,CORS必须配app.Options()预检路由。

iris/v12/middleware 包怎么装不下来
直接 go get github.com/kataras/iris/v12/middleware 会失败,因为这个路径在 v12.2.5 及之后版本中已**不再作为独立模块发布**。Iris 官方把常用中间件(如 JWT、gzip、cors 等)全部内聚进了主包 github.com/kataras/iris/v12,不再拆出子模块。
所以你不需要单独安装 middleware 插件——只要确保主框架是最新版,就能直接导入使用:
-
go get github.com/kataras/iris/v12@latest(推荐) - 或锁定到已知稳定版:
go get github.com/kataras/iris/v12@v12.2.5 - 检查
go.mod中是否已含github.com/kataras/iris/v12 v12.2.5,没有就补上并go mod tidy
JWT 中间件怎么用,为什么 import 报错
报错 cannot find package "github.com/kataras/iris/v12/middleware/jwt" 是因为路径过时了。v12.2.5 起,JWT 相关工具已移到 github.com/kataras/iris/v12/middleware/jwt → 实际应改用 github.com/kataras/iris/v12/middleware/jwt?不对——它已被移除,正确做法是:**不用官方 JWT 中间件,改用社区标准库 + 手写逻辑**。
原因:Iris 官方维护的 jwt 子包长期未更新,不兼容 golang-jwt/jwt/v5,且缺乏对 SigningMethodEd25519 或自定义 claims 的支持。生产项目应绕过它:
- 导入标准 JWT 库:
go get github.com/golang-jwt/jwt/v5 - 自己写
authMiddleware函数,用jwt.ParseWithClaims解析 - 校验通过后调用
ctx.Values().Set("user", user)透传,别依赖ctx.User.Set()(它只是个空壳)
CORS 中间件为什么注册了还是跨域失败
不是中间件没生效,而是 **OPTIONS 预检路由根本没注册**。Iris 不会自动捕获 OPTIONS 请求,哪怕你在 app.Use() 里写了 CORS 逻辑,只要没显式注册对应路径的 app.Options(),请求连中间件都不会进。
必须配齐两样才能跑通:
- 注册预检路由:
app.Options("/api/*", corsHandler)(注意路径要和实际 API 一致) - 在
corsHandler中判断ctx.Method() == "OPTIONS"并设置头:Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers - 若启用了
credentials: 'include',Access-Control-Allow-Origin不能是"*",得从ctx.GetHeader("Origin")动态白名单校验
gzip、recover、logger 这些“开箱即用”的中间件在哪
它们都在主包里,但**不是以 middleware.XXX 形式导出**,而是作为顶层函数或结构体存在:
- gzip:用
iris.Gzip(类型是iris.Handler),直接app.Use(iris.Gzip) - panic 恢复:用
recover.New()(来自github.com/kataras/iris/v12/middleware/recover—— 这个路径现在有效!它是唯一保留的 middleware 子包) - 日志:别用
iris.Logger()(已弃用),改用app.Logger().Info().Msg()配合上下文字段;若需请求级日志,手写中间件调用ctx.Application().Logger()
最容易被忽略的是:这些函数都要求你调用 ctx.Next(),否则链路中断。比如 recover.New() 内部已帮你做了,但你自己写的日志中间件如果漏掉这行,后续所有 handler 都不会执行。


















