Go 从router.HandleFunc调用返回多个中间件函数
我正在使用gorilla/mux,我有:Go 从router.HandleFunc调用返回多个中间件函数,go,gorilla,Go,Gorilla,我正在使用gorilla/mux,我有: router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST") 而h.makeRegisterNewser看起来像: func (h Handler) makeRegisterNewUser(v interface{}) http.HandlerFunc { type RespBody = ...; type ReqBody = ...
router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")
而h.makeRegisterNewser
看起来像:
func (h Handler) makeRegisterNewUser(v interface{}) http.HandlerFunc {
type RespBody = ...;
type ReqBody = ...
return func(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&ReqBody)
// ...
json.NewEncoder(w).Encode(RespBody{});
}
}
我的问题是-有没有办法从MakeRegisterNewser返回多个http.HandlerFuncs?大概是这样的:
router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")
func (h Handler) makeRegisterNewUser(v interface{}) (http.HandlerFunc...) {
type RespBody = ...;
type ReqBody = ...
return func(w http.ResponseWriter, r *http.Request) {
// 1
}, func(w http.ResponseWriter, r *http.Request) {
// 2
}, func(w http.ResponseWriter, r *http.Request) {
// 3
}
}
我不确定中间件是否可以像Node.js Express一样链接到Go中 您可以使用包装器链接多个
http.Handler
:
type Middleware struct {
next http.Handler
}
func (m Middleware) Wrap(handler http.Handler) http.Handler {
m.next = handler
return m
}
func (m Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// run your handler code here
// write error into w and return if you need to interrupt request execution
// call next handler
m.next.ServeHTTP(w, r)
}
注册链接包装器和主处理程序:
h1 := Middleware{}
h2 := OtherMiddleware{}
router.Handle("/some_route", h1.Wrap(h2.Wrap(mainHandler))).Methods(http.MethodPost)
请求将执行h1
,h2
,最后执行mainHandler
例如,您可以在
h1
中登录请求,在h2
中授权,并将业务逻辑保存在mainHandler
中。您可以更新您的问题并解释为什么一条路由需要3个函数吗?@DmitryHarnitski因此中间件函数是关联的-1,2,3按请求的顺序(串行)调用。例如,1和2可以写“res.headers”,3可以写“res.body”,等等。非常好,ty,如果在接下来的一两天没有更好的东西出现,他会接受的!在示例的底部,是router.Handle()
,还是应该是router.HandleFunc()
?只是想澄清一下,我认为应该是后者,可能是打字错误,谢谢。在我的示例中应该是router.Handle()
,因为我们使用的结构实现了http.Handler
router.HandleFunc()
需要func()
作为参数。