echoでmiddlewareを挟もうとしてハマった話
echoでエンドポイントにmiddlewareをはさもうとしていろいろハマったのでメモ。
echoでルーティングする場合は以下のようにecho.Echo
のGET、POSTであったり、Addだったりを呼ぶわけなんですが、それとは別に直接echo.Router
のAddを使ってルーティングしたりもできます。
echo.Echoを使う場合
e.GET("/", func (c echo.Context) error { return c.String(http.StatusOK, "HelloWorld") })
echo.Routerを使う場合
r := e.Router() r.Add("GET", "/", func(c echo.Context) error { return c.String(http.StatusOK, "HelloWorld") })
私の場合はecho.Router
を使っていてmiddlewareをどうやって挟もうかと考えていたのですが、ドキュメントを見ても見てもやり方が分からず諦めてソースを眺めていたら面倒くさくなりそうなことが発覚。以下がそのソース。
// Add registers a new route for an HTTP method and path with matching handler // in the router with optional route-level middleware. func (e *Echo) Add(method, path string, handler HandlerFunc, middleware ...MiddlewareFunc) *Route { name := handlerName(handler) e.router.Add(method, path, func(c Context) error { h := handler // Chain middleware for i := len(middleware) - 1; i >= 0; i-- { h = middleware[i](h) } return h(c) }) r := &Route{ Method: method, Path: path, Name: name, } e.router.routes[method+path] = r return r }
単純な話、echo.Echo
を使ってルーティングをする際にecho.Router
を内部で使っていて、そこのHandleFuncにmiddlewareを挟む処理を入れているようでした。さすがにライブラリで隠蔽されている部分を自分で実装する気にはならないので諦めてecho.Echo
を使うようにしました。。。