LoginSignup
2
0

More than 3 years have passed since last update.

gob: name not registered for interface の対処

Posted at

初投稿です。

GAE/Goでgo1.11対応をしたときに、タイトルのエラーでだいぶハマってしまいました。

経緯

従来は、セッションのicza/sessionを使用していたのですが、build appengineタグが廃止されたとのことで現在正しく動かなくなっています。そのため、gorilla/sessionsを使ってセッションまわりのコードを書き直していたら...という感じで、セッションまわりの対応で下記のエラーと戦うことになりました。

ERROR: %!(EXTRA securecookie.MultiError=securecookie: error - caused by: securecookie: error - caused by: gob: name not registered for interface: "hoge"

やったこと

デバッグ用のページを作り、そこでエラーの原因を調べます。
色々と調べてみて、とりあえずセッション名を変更して、新しいセッションを生成。

session.go
const (
    // ここを変更
    sessionName = "session"
)

func newSession(c echo.Context) (*sessions.Session, error) {
    store := sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))
    session, err := store.Get(c.Request(), sessionName)
    return session, err
}

func SaveSession (c echo.Context)  {
    sess, err := newSession(c)
    // セッションを保存する処理
}

次に、newSessionが呼ばれるたびに、新しいクッキーストアが生成されるのが影響しているのかと考え、sessions.NewCookieStoreを関数の外に出してみました。

session.go
const (
    sessionName = "session"
)

var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

func newSession(c echo.Context) (*sessions.Session, error) {
    session, err := store.Get(c.Request(), sessionName)
    return session, err
}

func SaveSession (c echo.Context)  {
    sess, err := newSession(c)
    // セッションを保存する処理
}

これで、デバッグ用のページではエラーが出なくなったのですが、セッションを使用したいページで同じことをしてもエラーは変わりません。

そこから色々と考えられる限りのことを試していき、

app.go
func main() {
    //構造体を使う場合、セッションの保存などの処理が行われる前にRegisterをしておかないとエラーになる
    gob.Register(Hoge{})

    // 以下ルーティング等

}

セッションの処理を呼び出している全ての処理の前で、gob.Registerで型の登録をすることで解決しました。
(これまでは、様々なところでセッションの処理を呼び出している内の、一ヶ所のみでgob.Registerを呼び出していました。)

セッションに構造体を入れたい場合は、gob.Registerをgob.Registerが必要な処理の前に書きましょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0