Go のミドルウェアは、懸念事項を分離し、追加機能でリクエスト ハンドラーを強化します。従来のミドルウェア パターンでは、メインのリクエスト ハンドラーの前後でハンドラーを実行します。ただし、エラー処理はサポートされていないため、面倒になる可能性があります。
これに対処するには、次のように定義されたエラー処理リクエスト ハンドラを使用できます。
type errorHandler func(http.ResponseWriter, *http.Request) error
これらのハンドラーを使用すると、エラーを直接返すことができるため、エラー処理がより直感的になります。
ミドルウェア パターンとエラー処理ハンドラーを組み合わせるために、チェーンの最終ステップとして機能する追加のミドルウェアを導入します。
func errorHandler(h MyHandlerFunc) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := h(w, r) if err != nil { // Handle error here } }) }
このミドルウェアは、特別なエラーを返すハンドラー関数 MyHandlerFunc のタイプ。
これを使用するにはパターンでは、エラー処理ハンドラーを errorHandler ミドルウェアでラップし、ミドルウェア チェーンの最後に追加します。
moreMiddleware(myMiddleware(errorHandler(myhandleFuncReturningError)))
次の例を考えてみましょう。
func loggingHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Before executing the handler. start := time.Now() log.Printf("Started %s %s", r.Method, r.URL.Path) next.ServeHTTP(w, r) // After executing the handler. log.Printf("Completed %s in %v", r.URL.Path, time.Since(start)) }) } func errorHandle(w http.ResponseWriter, r *http.Request) error { w.Write([]byte(`Hello World from errorHandle!`)) return nil } func main() { http.Handle("/", errorHandler(errorHandle)) log.Fatal(http.ListenAndServe(":8080", nil)) }
この例では、loggingHandler は従来のミドルウェアであり、errorHandle はエラー処理リクエスト ハンドラーです。 errorHandler ミドルウェアは errorHandle をラップし、エラーが適切に処理されるようにします。
以上がGo ミドルウェアはリクエスト ハンドラーから返されたエラーを効果的に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。