对我的应用程序的每个请求都应该使用一些中间件。使用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)))发布于 2015-08-26 20:04:44
最好的方法是将中间件封装为一个保存其状态的结构,而不仅仅是一个无状态函数。(您也可以将其包装为闭包,但结构更干净,海事组织):
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"))https://stackoverflow.com/questions/32234714
复制相似问题