我可以将我的函数用作“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”中间件吗的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gorilla MUX 和 Negroni 子路由中间件
为啥我的 react-router 链接会将我带到页面中间?