猿问

将参数传递给 Negroni 中间件

对我的应用程序的每个请求都应该使用一些中间件。使用 Negroni docs 我已经实现了它,如下所示:


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)))


qq_遁去的一_1
浏览 148回答 1
1回答

慕标琳琳

最好的方法是将您的中间件封装为一个保存其状态的结构,而不仅仅是一个无状态函数。(您也可以将其包装为闭包,但结构在 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"))
随时随地看视频慕课网APP

相关分类

Go
我要回答