2016-12-05 18 views
0

私はGoでjustinas/aliceミドルウェアを使用しています。ミドルウェアで使用されている関数に引数を渡します。例えばGoのアリスミドルウェアにパラメータを渡すにはどうすればよいですか?

middlewareChain := alice.New(Func1(foo string,foo2 string)) 

私はそれをどのように行うことができますか?

+2

を使用したい場合は、ドキュメントをすることはできません:あなたの関数は、あなたがアリスに登録するとき、あなたは、必要な機能を返すようなことができ、いくつかのparamsを必要に応じてミドルウェアのfuncは 'func(http.Handler)http.Handler'の形式でなければなりません、あなたはセッションデータや他のストアメカニズムのような別のメソッドを見つけなければなりません。 – Motakjuq

+1

また、コンテキストを使用してこれを行うオプションも追加したいと思っています。 – saarrrr

答えて

1

Motakjuqで述べたように、オプションの引数を取るミドルウェアは、func (http.Handler) http.Handlerの署名である必要があるため、直接書くことはできません。

あなたのできることは、ミドルウェア機能を生成する関数を作ることです。

func middlewareGenerator(foo, foo2 string) (mw func(http.Handler) http.Handler) { 

    mw = func(h http.Handler) http.Handler { 
     return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      // Use foo1 & foo2 
      h.ServeHTTP(w, r) 
     }) 
    } 
    return 
} 

次に、あなたは、すべての要求でFunc1変化あなたのparamsは、あなたがに引数を渡すことができない場合はたぶん私は、あなたの質問を理解していなかった以下の

middlewareChain := alice.New(middlewareGenerator("foo","foo2"))

1

を行うことができます関数。

func Func1(foo, foo2, timeoutMessage string) alice.Constructor { 
    //... something to do with foo and foo2 
    return func(h http.Handler) http.Handler { 
     return http.TimeoutHandler(h, 1*time.Second, timeoutMessage) 
    } 
} 

そして、あなたはそれを

chain := alice.New(Func1("", "", "time out")).... 
関連する問題