英文:
How can I pass parameters to a alice middleware in Go?
问题
我正在使用Go语言中的justinas/alice中间件,并且我想将参数传递给中间件中使用的函数。
例如:
middlewareChain := alice.New(Func1(foo string,foo2 string))
我该如何做到这一点?
英文:
I am using justinas/alice middleware in Go, and I want to pass arguments to the function used in the middleware.
For example:
middlewareChain := alice.New(Func1(foo string,foo2 string))
How can I do that?
答案1
得分: 4
如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) {
// 使用 foo1 和 foo2
h.ServeHTTP(w, r)
})
}
return
}
然后你可以这样做:
middlewareChain := alice.New(middlewareGenerator("foo", "foo2"))
英文:
As mentioned by Motakjuq
, you can't directly write a middleware that takes in options as an argument since they need to be of the signature func (http.Handler) http.Handler
.
What you can do is make a function that generates your middleware function.
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
}
Then you can do the following
middlewareChain := alice.New(middlewareGenerator("foo","foo2"))
答案2
得分: 1
也许我没有理解你的问题,如果你在每个请求中的Func1
中的参数都会改变,那么你不能将参数传递给函数。如果你的函数在注册时需要一些参数,你可以返回所需的函数,类似于:
func Func1(foo, foo2, timeoutMessage string) alice.Constructor {
//... 使用 foo 和 foo2 做一些操作
return func(h http.Handler) http.Handler {
return http.TimeoutHandler(h, 1*time.Second, timeoutMessage)
}
}
如果你想使用它:
chain := alice.New(Func1("", "", "time out"))....
英文:
Maybe I didn't understand your question, if your params in Func1
change in every request, you can't pass the arguments to the function. If your function required some params when you register it with alice, you can return the required function, something like:
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)
}
}
And if you want to use it
chain := alice.New(Func1("", "", "time out"))....
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论