2017-03-23 3 views
0

J'ai une fonction que je l'utilise comme emballage pour chaque demande GET:Puis-je utiliser ma fonction comme `middleware negroni`

type HandlerFunc func(w http.ResponseWriter, req *http.Request) (interface{}, error) 

func WrapHandler(handler HandlerFunc) http.HandlerFunc { 

    return func(w http.ResponseWriter, req *http.Request) { 

     data, err := handler(w, req) 

     if err != nil { 
      log.Println(err) 
      w.WriteHeader(500) 
     } else { 
      w.Header().Add("Content-Type", "application/json") 
      resp, _ := json.Marshal(data) 
      w.Write(resp) 
     } 
    } 
} 
routeur

:

router.HandleFunc("/rss/unread/{rss_type}", 
    controllers.WrapHandler(controllers.GetUnreadRssFeeds)) 

exemple:

func GetUnreadRssFeeds(w http.ResponseWriter, r *http.Request) (interface{}, error) { 

    vars := mux.Vars(r) 
    rss_type, err := strconv.Atoi(vars["rss_type"]) 
    feeds, err := (&postgres.FeedService{}).GetUnreadRssFeeds(rss_type) 
    return feeds, err 
} 

Maintenant, j'ai besoin d'envelopper chaque demande dans le routeur: controllers.WrapHandler(controllers.GetUnreadRssFeeds). Je cherche le moyen de l'éviter.

Puis-je transformer mon WrapHandler pour l'utiliser comme negroni middleware? Existe-t-il un moyen de transmettre des données entre les fonctions middleware negroni?

+1

Copie possible de [Comment est-ce que je peux combiner Go modèle de middleware avec l'erreur de renvoi des gestionnaires de demande?] (Http://stackoverflow.com/questions/42871194/how-can-i-combine-go-middleware-pattern-with- error-return-request-handlers) – Zoyd

Répondre

0

L'obstacle que vous devrez franchir en utilisant votre WrapHandler en tant qu'intermédiaire negroni est que votre WrapHandler est en réalité un adaptateur, pas un emballage. Vous prenez un non http.HandlerFunc et le convertir en http.HandlerFunc.

Je ne peux pas penser à un moyen de faire cela dans le middleware, parce que le middleware agit uniquement sur la demande/réponse et le http.HandlerFunc (s).