echoを使っていてハマったことまとめ
概要
Go言語のWebフレームワークであるechoを使っていてハマったことについて、メモとしてまとめていこうと思います。
middleware
CORS
CORSWithConfig()の戻り値とe.Use()の引数が不一致
事象
自分の作ったフロントエンドからのみアクセスできるようにカスタムCORS設定をしようとして以下のようなコードを作成しました。
package main
import (
"net/http"
"github.com/labstack/echo/middleware"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"http://localhost:3000"},
AllowMethods: []string{http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete},
}))
e.GET("/public", public)
e.Logger.Fatal(e.Start(":1323"))
}
func public(c echo.Context) error {
return c.String(http.StatusOK, "hello public!")
}
すると、以下のようなエラーに遭遇しました。
cannot use middleware.CORSWithConfig(middleware.CORSConfig literal) (type "github.com/labstack/echo".MiddlewareFunc) as type "github.com/labstack/echo/v4".MiddlewareFunc in argument to e.Use
どうやらe.Use()ではv4
のMiddlewareFun
を引数として要求しているようですが、
CORSWithConfig()
の戻り値はv4
ではないMiddlewareFun
らしいです。
解決策
最初は、キャストすればいいかと思ったのですが、うまくいきませんでした。
そこで、少し調べてみるととても簡単なことで、自分がGoのバージョン管理などに不慣れなことが原因でした。
問題の箇所は、以下のimoprt文になります。
"github.com/labstack/echo/middleware"
"github.com/labstack/echo/v4"
ここで、echo
についてはv4
を指定してインポートしているのですが、middleware
は何も指定しておりません。
そのため、インポートされたmiddleware
とecho
の間でバージョンの不一致が起きてしまい先ほどのエラーが生じたようです。
解決策は、簡単で以下のようにmiddleware
にもv4
を付けてあげるだけ。
"github.com/labstack/echo/v4/middleware"
これでエラーは出なくなり、無事にCORSの設定ができました。
終わりに
今後もecho
を使う中で自分がハマったことや、コメントでいただいたハマりポイントについて書いていきたいと思います。
何かご指摘や、ハマりポイントなどありましたらコメントよろしくお願いします。