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

标签 go gorilla

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

请求将执行h1h2,最后是mainHandler

例如,您可以在h1中记录请求,在h2中进行授权,在mainHandler中保留业务逻辑。

关于go - 从 router.HandleFunc 调用返回多个中间件函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53576200/

相关文章:

session - 如何检测 session 是否即将过期?

gorilla Websocket 没有收到消息

go - 如何正确地与路由器 handleFunc 进行模式匹配?

Gorilla Mux 不处理我的路径

go - 这个文字的类型是什么?

session - Gorilla session 包混淆

go - 存储 Go 编码数据的通用函数

linux - 如何在 Go 中将消息打印到 stderr?

go - 从 URL 的根路径提供嵌入式文件系统

go - 如何在gofpdf中使用图片Url