我可以将我的函数用作“negroni”中间件吗

Posted

技术标签:

【中文标题】我可以将我的函数用作“negroni”中间件吗【英文标题】:Can I use my function as `negroni` middleware 【发布时间】:2017-03-23 13:59:19 【问题描述】:

我有一个函数用作每个 GET 请求的包装器:

type HandlerFunc func(w http.ResponseWriter, req *http.Request) (interface, error)

func WrapHandler(handler HandlerFunc) http.HandlerFunc 

    return func(w http.ResponseWriter, req *http.Request) 

        data, err := handler(w, req)

        if err != nil 
            log.Println(err)
            w.WriteHeader(500)
         else 
            w.Header().Add("Content-Type", "application/json")
            resp, _ := json.Marshal(data)
            w.Write(resp)
        
    

路由器:

router.HandleFunc("/rss/unread/rss_type",
   controllers.WrapHandler(controllers.GetUnreadRssFeeds))

示例:

func GetUnreadRssFeeds(w http.ResponseWriter, r *http.Request) (interface, error)  

    vars := mux.Vars(r)
    rss_type, err :=  strconv.Atoi(vars["rss_type"])
    feeds, err := (&postgres.FeedService).GetUnreadRssFeeds(rss_type)
    return feeds, err

现在我需要在路由器中包装每个请求:controllers.WrapHandler(controllers.GetUnreadRssFeeds)。我正在寻找避免它的方法。

我可以转换我的WrapHandler 以将其用作negroni 中间件吗?有没有办法在negroni中间件函数之间传递数据?

【问题讨论】:

How can I combine Go middleware pattern with error returning request handlers?的可能重复 【参考方案1】:

使用 WrapHandler 作为 negroni 中间件时必须跨越的障碍是 WrapHandler 实际上是一个适配器,而不是一个包装器。您正在使用非http.HandlerFunc 并将其转换为http.HandlerFunc

我想不出在中间件中做到这一点的方法,因为中间件只是作用于请求/响应和http.HandlerFunc(s)。

【讨论】:

以上是关于我可以将我的函数用作“negroni”中间件吗的主要内容,如果未能解决你的问题,请参考以下文章

Go语言经典库使用分析| Negroni 中间件

使用 Gorilla MUX 和 Negroni 子路由中间件

可以在 keras 损失函数中直接访问中间层吗?

为啥我的 react-router 链接会将我带到页面中间?

《Web Development with Go》JWT认证满意版

我需要在 asp.net Core 中创建 XSRF 中间件吗?