ホームページ > バックエンド開発 > Golang > Go ミドルウェアはリクエスト ハンドラーから返されたエラーを効果的に処理するにはどうすればよいでしょうか?

Go ミドルウェアはリクエスト ハンドラーから返されたエラーを効果的に処理するにはどうすればよいでしょうか?

DDD
リリース: 2024-12-16 15:39:18
オリジナル
420 人が閲覧しました

How Can Go Middleware Effectively Handle Errors Returned by Request Handlers?

エラーを返すリクエスト ハンドラーを備えたミドルウェア

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート