我可以将我的函数用作 `negroni` 中间件吗
Can I use my function as `negroni` middleware
我有一个函数用作每个 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
中间件函数之间传递数据?
使用 WrapHandler
作为 negroni 中间件必须克服的障碍是 WrapHandler
实际上是一个适配器,而不是包装器。您正在使用非 http.HandlerFunc
并将其转换为 http.HandlerFunc
.
我想不出在中间件中做到这一点的方法,因为中间件只作用于 request/response 和 http.HandlerFunc
(s)。
我有一个函数用作每个 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
中间件函数之间传递数据?
使用 WrapHandler
作为 negroni 中间件必须克服的障碍是 WrapHandler
实际上是一个适配器,而不是包装器。您正在使用非 http.HandlerFunc
并将其转换为 http.HandlerFunc
.
我想不出在中间件中做到这一点的方法,因为中间件只作用于 request/response 和 http.HandlerFunc
(s)。