路由级中间件必须用e.GET()等方法的第三个参数传入,如e.GET("/admin/profile", profileHandler, jwtMiddleware),多个中间件按从左到右顺序执行,遵循洋葱模型,且仅对该路由生效。

路由级中间件必须用 e.GET() 等方法的第三个参数传入
不是所有中间件都适合全局注册,比如某个 API 需要 JWT 验证而其他接口走 BasicAuth,这时就得绑定到单个路由上。Echo 不支持在 e.Use() 里按路径过滤,也不接受字符串路径匹配逻辑——它只认「显式声明」。
正确做法是把中间件函数直接作为 handler 的前一个参数传进去,顺序不能错:
e.GET("/admin/profile", profileHandler, jwtMiddleware)
e.POST("/login", loginHandler, basicAuthMiddleware)
-
jwtMiddleware和basicAuthMiddleware必须是符合echo.MiddlewareFunc类型的函数(即接收echo.HandlerFunc并返回echo.HandlerFunc) - 多个中间件可连续追加:
e.GET("/x", h, m1, m2, m3),执行顺序就是从左到右(洋葱模型外层→内层) - 不能写成
e.GET("/x", h).Use(m)——GET()返回的是*echo.Echo的链式调用对象,没有Use()方法
局部中间件和路由组中间件容易混淆
很多人以为 group.Use() 是“局部”的等价替代,其实不然:路由组中间件作用于整个前缀路径下的所有子路由,而单个路由中间件只对那一条 GET/POST/PUT 生效。
例如:
api := e.Group("/api")
api.Use(loggingMiddleware) // 所有 /api/* 路由都会经过
api.GET("/users", usersHandler) // ✅ 经过 loggingMiddleware
e.GET("/health", healthHandler, authMiddleware) // ✅ 只有这个路由经过 authMiddleware
e.GET("/api/health", healthHandler) // ❌ 不经过 authMiddleware,但经过 loggingMiddleware
- 如果你只想让
/api/health这一个接口跳过日志,就不能靠路由组,得单独给它配无日志中间件(或用条件判断绕过) -
group.Use()注册的中间件不会影响e.GET("/xxx")这类顶层路由,哪怕路径碰巧匹配前缀
中间件执行顺序在单个路由上仍遵循洋葱模型
即使只绑定了一个路由,多个中间件之间依然按注册顺序形成嵌套:最先写的在外层,最后写的在最内层(紧贴 handler)。这对错误处理、Context 修改时机很关键。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
典型陷阱是把 recoverMiddleware 放在了 authMiddleware 后面:
e.POST("/upload", uploadHandler, authMiddleware, recoverMiddleware)
- 如果
authMiddleware内部 panic(比如 JWT 解析出错未捕获),recoverMiddleware根本收不到——它在 auth 之后才执行 - 正确顺序应为:
recoverMiddleware, authMiddleware, uploadHandler,确保 panic 能被最早注册的那个捕获 - 同理,
requestIDMiddleware应尽可能靠前,否则后续中间件取c.Get("req_id")会是 nil
别在路由中间件里做阻塞操作
单个路由绑定的中间件虽然作用域小,但仍在主 goroutine 中同步执行。一旦里面调用了 http.Get、time.Sleep 或未缓存的 DB 查询,整个请求就卡住,且无法被并发抵消。
- JWT 验签务必用带缓存的解析(如
github.com/golang-jwt/jwt/v5+sync.Map缓存 key set) - 不要在中间件里写文件日志;用异步 logger 或统一交由全局日志中间件处理
- 若必须调用外部服务,考虑改用 context-aware timeout +
http.Client,并明确设ctx.Done()响应
局部中间件看似轻量,但执行位置离业务 handler 最近,出问题时排查链路反而更短——这也意味着你得更小心它的副作用。










