Промежуточное ПО Mux без обработчика - PullRequest
0 голосов
/ 28 ноября 2018

Я создаю приложение, используя Micro Service Architecture.На шлюзе я хочу направить запросы к правильным конечным точкам.

Но конечная точка теперь известна во время выполнения и должна быть настроена в БД.

Ниже, если кодполучить маршрутизатор.

func getRouter() *mux.Router {
    r := mux.NewRouter()

    r.Use(dynamicRouteMiddleware)

    return r
}

Само промежуточное программное обеспечение выглядит так:

func dynamicRouteMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("Error")
    })
}

Однако «Ошибка» никогда не печатается.Он печатается только когда я ставлю обработчик для '/'

Как я могу создать промежуточное ПО без обработчиков?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

В промежуточном программном обеспечении вам нужно вызвать обработчик next, чтобы все входящие запросы перешли на маршрут назначения.

func dynamicRouteMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("Error")
        next.ServeHTTP(w, r) // <------- this one
    })
}

Вы можете зарегистрировать любые маршруты, как хотите, но в самом конце выполнитеУбедитесь, что объект r используется в качестве обработчика маршрута /.

r.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("test"))
})

r.HandleFunc("/test/12", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("test 12"))
})

r.HandleFunc("/about-us", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("about us"))
})

http.Handle("/", r)
http.ListenAndServe(":8080", nil)

При доступе к /test, /test/12 или /about-us;Error будет по-прежнему печататься.

Ранее он не печатался, поскольку вы не переходите к следующему обработчику.Код next.ServeHTTP(w, r) обязателен в вашем случае.

0 голосов
/ 29 ноября 2018

Это называется "middleware", потому что оно должно поместить ваш Handler в "середину".Он получает ввод перед вашим Handler и получает вывод вашего Handler.

По сути, чтобы ваше промежуточное программное обеспечение работало, у вас должен быть хотя бы один обработчик.Предпочтительно вы можете просто использовать эту функциональность, которая вам нужна, в Handler, а не в промежуточном программном обеспечении.

...