将参数传递给 Negroni 中间件
Passing arguments to Negroni middleware
对我的应用程序的每个请求都应该使用一些中间件。使用 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)))
最好的方法是将中间件封装为保存其状态的结构,而不仅仅是无状态函数。 (你也可以把它包装成一个闭包,但在我看来,结构更干净):
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)
}))
或者你可以有一个 returns 中间件函数的函数:
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"))
对我的应用程序的每个请求都应该使用一些中间件。使用 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)))
最好的方法是将中间件封装为保存其状态的结构,而不仅仅是无状态函数。 (你也可以把它包装成一个闭包,但在我看来,结构更干净):
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)
}))
或者你可以有一个 returns 中间件函数的函数:
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"))