布団の中にいたい

Elasticsearchいじったり、Androidアプリ書いたり。最近は数学の勉強が楽しくなってきました。

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を使うようにしました。。。