Go 从router.HandleFunc调用返回多个中间件函数

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 = ...

我正在使用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 = ...


    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()
作为参数。