为了账号安全,请及时绑定邮箱和手机立即绑定

将参数传递给 Negroni 中间件

将参数传递给 Negroni 中间件

Go
qq_遁去的一_1 2021-11-01 16:49:34
对我的应用程序的每个请求都应该使用一些中间件。使用 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)))
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信