2016-12-05 115 views
0

我在Go中使用justinas/alice中间件,我想将参数传递给中间件中使用的函数。如何将参数传递给Go中的alice中间件?

例如:

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

我怎么能这样做?

+2

你不能,DOC中间件func应该具有'func(http.Handler)http.Handler'的形式,你必须找出不同的方法,如会话数据或其他存储机制。 – Motakjuq

+1

还想补充一点,使用Context是另一种选择,这就是它的用处。 – 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 
} 

然后,你可以做以下

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

1

也许我不明白你的问题,如果你在每次请求Func1变化参数,可以,你不能传递参数给功能。如果您需要的功能部分,当你与爱丽丝注册它PARAMS,你可以返回所需的功能,这样的:

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"))....