2017-06-21 4 views
0

J'essaie d'ajouter un middleware seulement sur certaines routes. J'ai écrit ce code:Subroutes middlewares avec Gorilla MUX et 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) 

}

Je me attends à des journaux de demande uniquement pour les chemins avec le préfixe/admin. Je vois une ligne de journal quand je fais "GET/admin", mais pas quand je fais "GET/admin/articles/new". J'ai essayé par force brute d'autres combinaisons mais je ne peux pas l'obtenir. Qu'est ce qui ne va pas avec mon code? J'ai vu d'autres façons, comme envelopper le HandlerFunc sur chaque définition d'itinéraire, mais je voulais le faire une fois pour un préfixe ou un sous-programme.

Le middleware de journalisation que j'utilise ici est à tester, peut-être qu'un middleware Auth a plus de sens, mais je voulais juste le faire fonctionner.

Merci!

Répondre

1

Le problème est la façon dont vous créez un sous-itinéraire /admin. Code de référence complet est ici 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") 

Maintenant, accéder à ces URL. Vous verrez les journaux uniquement pour les sous-routes /admin.

+0

Ça marche, merci. Je voulais utiliser les middlewares disponibles sur les gestionnaires de paquets Gorilla. –

+0

Ensuite, j'ai pu utiliser gestionnaire Gorilla faire:. 'router.PathPrefix ("/ admin") Handler (negroni.New ( \t negroni.Wrap (handlers.CombinedLoggingHandler (os.Stdout, adminBase)), \t)) ' –

+0

Oui vous pouvez l'utiliser, juste pour démontrer la définition du sous-routeur je ne l'ai pas utilisé dans l'exemple. Désolé pour ça. – jeevatkm