gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:20:04 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com