我正在使用 gorilla/mux 我有这个:
router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")
和h.makeRegisterNewUser
看起来像:
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{});
}
}
我的问题是 - 有没有办法从 makeRegisterNewUser 返回多个 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
中保留业务逻辑。
关于go - 从 router.HandleFunc 调用返回多个中间件函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53576200/