Промежуточное ПО Subroutes с Gorilla MUX и Negroni

Я пытаюсь добавить промежуточное ПО только на некоторые маршруты. Я написал этот код:

func main() {
  router := mux.NewRouter().StrictSlash(false)

  admin_subrouter := router.PathPrefix("/admin").Subrouter()

  //handlers.CombinedLoggingHandler comes from gorilla/handlers
  router.PathPrefix("/admin").Handler(negroni.New(
    negroni.Wrap(handlers.CombinedLoggingHandler(os.Stdout, admin_subrouter)),
  ))

  admin_subrouter.HandleFunc("/articles/new", articles_new).Methods("GET")
  admin_subrouter.HandleFunc("/articles", articles_index).Methods("GET")
  admin_subrouter.HandleFunc("/articles", articles_create).Methods("POST")

  n := negroni.New()
  n.UseHandler(router)
  http.ListenAndServe(":3000", n)

}

Я ожидаю увидеть журналы запросов только для путей с префиксом /admin. Я вижу строку журнала, когда делаю «GET/admin», но не вижу, когда делаю «GET/admin/articles/new». Пробовал перебором другие комбинации, но не получается. Что не так с моим кодом?

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

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

Спасибо!


person Matias    schedule 21.06.2017    source источник


Ответы (1)


Проблема заключается в том, как вы создаете подмаршруты /admin. Полный справочный код находится здесь https://play.golang.org/p/zb_79oHJed

// Admin
adminBase := mux.NewRouter()
router.PathPrefix("/admin").Handler(negroni.New(
    // This logger only applicable to /admin routes
    negroni.HandlerFunc(justTestLogger),
    // add your handlers here which is only appilcable to `/admin` routes
    negroni.Wrap(adminBase),
))

adminRoutes := adminBase.PathPrefix("/admin").Subrouter()
adminRoutes.HandleFunc("/articles/new", articleNewHandler).Methods("GET")

Теперь получите доступ к этим URL-адресам. Вы увидите журналы только для /admin подмаршрутов.

person jeevatkm    schedule 21.06.2017
comment
Это работает, спасибо. Я хотел использовать промежуточное программное обеспечение, доступное в обработчиках пакетов Gorilla. - person Matias; 21.06.2017
comment
Затем я смог использовать обработчик Gorilla, выполняющий: router.PathPrefix("/admin").Handler(negroni.New( negroni.Wrap(handlers.CombinedLoggingHandler(os.Stdout, adminBase)), )) - person Matias; 21.06.2017
comment
Да, вы можете использовать его, просто чтобы продемонстрировать определение подмаршрутизатора, я не использовал его в примере. Извини за это. - person jeevatkm; 21.06.2017
comment
Использовал точный код на подмаршрутизаторе в качестве базы. Функция обработчика не вызывается. - person Greg Miller; 12.09.2018