Question : Comment puis-je combiner le modèle de middleware Go avec des gestionnaires de requêtes qui renvoient des erreurs ?
Réponse :
Le modèle middleware dans Go permet de créer des composants réutilisables pouvant être appliqués aux gestionnaires HTTP. Cependant, les fonctions middleware traditionnelles ne gèrent pas nativement les erreurs.
Pour activer la gestion des erreurs dans le middleware, il est recommandé d'utiliser une fonction middleware distincte dédiée à cet effet. Cette fonction doit être placée à la fin de la chaîne middleware et gérer les erreurs renvoyées par les gestionnaires au sein de la chaîne.
// Pattern for a middleware function that checks for errors from the next handler. func errorHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := next.ServeHTTP(w, r) if err != nil { // Handle the error, e.g., by logging or returning an appropriate HTTP response. } }) }
Exemple :
Pour combiner les erreurs- renvoyant les gestionnaires avec le middleware de journalisation de l'exemple d'origine :
type errorHandler func(http.ResponseWriter, *http.Request) error // Create a special error-aware logging middleware. func loggingWithErrorHandler(next errorHandler) errorHandler { return func(w http.ResponseWriter, r *http.Request) error { // Before executing the handler. start := time.Now() log.Printf("Started %s %s", r.Method, r.URL.Path) err := next(w, r) // After executing the handler. log.Printf("Completed %s in %v", r.URL.Path, time.Since(start)) return err } } // Define an error-returning handler func. func errorHandlerFunc(w http.ResponseWriter, r *http.Request) error { w.Write([]byte("Hello World from errorHandlerFunc!")) return nil } // Assemble the middleware chain and error-aware middleware. http.Handle("/", loggingWithErrorHandler(errorHandlerFunc))
Cette combinaison permet la gestion des erreurs tout en conservant les avantages du middleware modèle. Le middleware encapsulé et sensible aux erreurs gérera toutes les erreurs renvoyées par le gestionnaire encapsulé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!