我在Go中使用justinas/alice中间件,我想将参数传递给中间件中使用的函数。如何将参数传递给Go中的alice中间件?
例如:
middlewareChain := alice.New(Func1(foo string,foo2 string))
我怎么能这样做?
我在Go中使用justinas/alice中间件,我想将参数传递给中间件中使用的函数。如何将参数传递给Go中的alice中间件?
例如:
middlewareChain := alice.New(Func1(foo string,foo2 string))
我怎么能这样做?
正如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"))
也许我不明白你的问题,如果你在每次请求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"))....
你不能,DOC中间件func应该具有'func(http.Handler)http.Handler'的形式,你必须找出不同的方法,如会话数据或其他存储机制。 – Motakjuq
还想补充一点,使用Context是另一种选择,这就是它的用处。 – saarrrr