gpt4 book ai didi

go - 将参数传递给 Negroni 中间件

转载 作者:IT王子 更新时间:2023-10-29 01:06:28 26 4
gpt4 key购买 nike

对我的应用程序的每个请求都应该使用一些中间件。我使用 Negroni 文档实现了它:

func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// do some stuff before
next(rw, r)
}

以及我在其他地方使用的:

n.Use(negroni.HandlerFunc(MyMiddleware))

但是,中间件需要接收一个额外的参数,我不确定如何构建它。目前我只是将值设置为全局变量以使其可用,但我确定有一个更优雅的方式?

我希望能够做这样的事情:

n.Use(negroni.HandlerFunc(MyMiddleware(val)))

最佳答案

最好的方法是将您的中间件封装为一个保存其状态的结构,而不仅仅是一个无状态函数。 (您也可以将其包装为闭包,但结构在 IMO 中更简洁):

type MyMiddleware struct {
someval string
}

func NewMyMiddleware(someval string) *MyMiddleware {
return &MyMiddleware{
someval: someval,
}
}


func (m *MyMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {

// Do Something with someval
fmt.Println(m.someval)

next(w, req)
}

初始化它很简单:

n.Use(NewMyMiddleware("foo"))

编辑:也许闭包实际上很简单:

 someval := foo

n.Use(negroni.HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// Do Something with someval
fmt.Println(someval)

next(w, req)
}))

或者你可以有一个返回中间件函数的函数:

func NewMiddleware(someval string) negroni.HandlerFunc {
return negroni.HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// Do Something with someval
fmt.Println(someval)

next(w, req)
})
}

然后

n.Use(NewMiddleware("foo"))

关于go - 将参数传递给 Negroni 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com