Возврат нескольких функций промежуточного программного обеспечения из роутера - PullRequest
0 голосов
/ 02 декабря 2018

Я использую 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{});
    }
}

мой вопрос - есть ли способ вернуть несколько http.HandlerFuncs от makeRegisterNewUser?Примерно так:

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
    }
}

Я не уверен, можно ли связать промежуточное ПО в Go, как это происходит в Node.js Express.

1 Ответ

0 голосов
/ 02 декабря 2018

Вы можете объединить несколько 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.

...