У меня есть вопрос относительно промежуточного программного обеспечения в разных местах:
- Я читал об использовании промежуточного программного обеспечения только с stdlib для написания обработчиков запросов, как упоминалось здесь: (https://www.alexedwards.net/blog/making-and-using-middleware)
func middlewareOne(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Our middleware logic goes here...
next.ServeHTTP(w, r)
})
}
mux := http.NewServeMux()
mux.Handle("/", middlewareOne(middlewareTwo(finalHandler)))
Мне кажется логичным, что передача одного обработчика внутри другого в этом формате выполняет ServeHTTP
следующего промежуточного программного обеспечения. Я использую dgrouter для маршрутизации команд Discord, и я обнаружил, что могу использовать там промежуточное ПО, а также определенное в этом примере:
https://github.com/Necroforger/dgrouter/blob/master/examples/middleware/middleware.go#L40 -L59 метод, используемый для регистрации промежуточного программного обеспечения, определяется следующим образом:
https://github.com/Necroforger/dgrouter/blob/master/exrouter/router_wrapper.go#L41 -L49
Мой вопрос в том, почему промежуточное программное обеспечение не вызывается так, как это сделано в net/http
, а просто передается имя функции:
router.Group(func(r *exrouter.Route) {
// Added routes inherit their parent category.
// I set the parent category here and it won't affect the
// Actual router, just this group
r.Cat("main")
// This authentication middleware applies only to this group
r.Use(Auth)
log.Printf("len(middleware) = %d\n", len(r.Middleware))
r.On("testauth", func(ctx *exrouter.Context) {
ctx.Reply("Hello " + ctx.Get("member").(*discordgo.Member).Nick + ", you have permission to use this command")
})
})
r.Use (Auth)
Это то, что мне трудно понять. Почему не вызывается функция?