首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将参数传递给Negroni中间件

将参数传递给Negroni中间件
EN

Stack Overflow用户
提问于 2015-08-26 19:04:46
回答 1查看 1.1K关注 0票数 3

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

代码语言:javascript
复制
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
  // do some stuff before
  next(rw, r)
}

在其他地方,我用:

代码语言:javascript
复制
n.Use(negroni.HandlerFunc(MyMiddleware))

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

我希望能做这样的事情:

代码语言:javascript
复制
n.Use(negroni.HandlerFunc(MyMiddleware(val)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-26 20:04:44

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

代码语言:javascript
复制
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)
}

初始化它只是简单地:

代码语言:javascript
复制
n.Use(NewMyMiddleware("foo"))

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

代码语言:javascript
复制
 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)
}))

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

代码语言:javascript
复制
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)
    })
}

然后

代码语言:javascript
复制
n.Use(NewMiddleware("foo"))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32234714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档