nestjs における例外フィルター Exceptionfilter の具体的な使用法

nestjs における例外フィルター Exceptionfilter の具体的な使用法

Nestjs 例外フィルターといえば、非常に強力な .Net のグローバル フィルターについて触れなければなりません。理論的には、これは AOP アスペクト指向プログラミングと呼ばれ、例外処理を必要とする多くのシナリオを容易にします。 Nestjs の例外フィルターに戻ると、同様の機能を実装し、同様の処理方法を採用していますが、1 つは C# 用で、もう 1 つは Nodejs 用です。幸いなことに、両方のフレームワークで同様のものを見つけました。

アスペクト指向プログラミング (AOP) は、プログラミング仕様に似ています。これを実践する人たちは、これをインターフェース指向プログラミング、SOLID 原則などとも呼んでいます。

Nestjs での例外処理

デフォルトの例外処理

Nestjs には、HttpException に変換できる例外を処理するデフォルトのグローバル例外フィルターが組み込まれています。

HttpException またはそのサブクラスの例外の場合は、例外の JSON 形式が返されます。

{"exceptionCode":40005,"message":"カスタム例外","path":"/"}

HttpException またはそのサブクラスの例外でない場合は、次のコードが返されます。

{"statusCode":500,"message":"内部サーバーエラー"}

Nestjs は組み込みのデフォルトの例外処理を使用するため、キャッチされない例外によってプログラムがクラッシュすることはありません。

カスタム例外フィルタ処理

組み込み例外処理の戻り値の形式は調整できないため、カスタム例外が正常です。カスタム例外では、返される例外情報をカスタマイズし、カスタム例外コードを追加して、クライアント担当者が例外コードに応じて異なる表示を行えるようにすることができます。

例外をカスタマイズするにはどうすればいいですか?

車輪の再発明をしないことはプログラマーの自制心です。まず、独自の例外基本クラスを作成します。

"@nestjs/common" から HttpException をインポートします。

/**
 * 基本例外クラスを定義する *
 * @輸出
 * @class ベース例外
 * @extends {HttpException}
 */
エクスポートクラスBaseExceptionはHttpExceptionを拡張します{

  /**
   * BaseException のインスタンスを作成します。
   * @param {number} exceptionCode カスタム例外番号* @param {string} errorMessage プロンプトメッセージ* @param {number} statusCode ステータスコード* @memberof BaseException
   */
  コンストラクター(public exceptionCode: 数値、public errorMessage: 文字列、public statusCode: 数値) {
    super({ 例外コード: exceptionCode, エラーメッセージ: errorMessage }, ステータスコード);
  }

  /**
   * カスタム例外コードを取得 *
   * @戻る {*}
   * @memberof BaseException
   */
  getExceptionCode(): 数値 {
    this.exceptionCode を返します。
  }

  getErrorMessage(): 文字列 {
    this.errorMessage を返します。
  }

  getStatusCode(): 数値{
    this.statusCode を返します。
  }
}

次に、カスタム例外コードを追加する新しい不正な例外タイプを作成します。

"@nestjs/common" から HttpStatus をインポートします。
「./base.exception」から BaseException をインポートします。

エクスポートクラスUnCauhtExceptionはBaseExceptionを拡張します{
  コンストラクタ() {
    super(40000, "システム動作異常です。管理者に連絡してください!", HttpStatus.FORBIDDEN);
  }
}

カスタム例外を作成したので、次は不正な例外を処理する必要があります。まず、新しいカスタム例外処理の基本クラスを作成します。ここでは Express を使用することに注意してください。

"@nestjs/common" から { ArgumentsHost、ExceptionFilter、HttpException } をインポートします。
"@nestjs/common/interfaces" から { HttpArgumentsHost } をインポートします。
「src/exceptions/base.exception」から BaseException をインポートします。
"express"から{Response、Request}をインポートします。

/**
 * 異常な基本クラスフィルター *
 * @輸出
 * @class ベース例外フィルタ
 * @implements {ExceptionFilter<BaseException>}
 */
抽象クラス BaseExceptionFilter をエクスポートし、ExceptionFilter<BaseException> を実装します。
{
  /**
   *例外クラスのキャプチャ*
   * @抽象的な
   * @param {BaseException} 例外
   * @param {ArgumentsHost} ホスト
   * BaseExceptionFilter の @member
   */
  抽象 catch(例外: BaseException、ホスト: ArgumentsHost);

  /**
   * http リクエストのコンテキスト パラメータを取得する *
   * @保護されています
   * @param {ArgumentsHost} ホスト
   * @戻る {*}
   * BaseExceptionFilter の @member
   */
  保護された getHttpContext(ホスト: ArgumentsHost) {
    ホスト.switchToHttp() を返します。
  }

  /**
   * http 応答パラメータを取得する *
   * @保護されています
   * @param {HttpArgumentsHost} httpContext
   * @戻る {*}
   * BaseExceptionFilter の @member
   */
  保護されたgetResponse(httpContext: HttpArgumentsHost): レスポンス {
    httpContext.getResponse<Response>() を返します。
  }

  /**
   * httpリクエストパラメータを取得する *
   * @保護されています
   * @param {HttpArgumentsHost} httpContext
   * @戻る {*}
   * BaseExceptionFilter の @member
   */
  保護された getRequest(httpContext: HttpArgumentsHost): リクエスト {
    httpContext.getRequest<Request>() を返します。
  }

  /**
   * 例外情報をクライアントに書き込む *
   * @param {ArgumentsHost} ホスト
   * @param {BaseException} 例外
   * BaseExceptionFilter の @member
   */
  保護された writeToClient(ホスト: ArgumentsHost、例外: BaseException) {
    const ctx = this.getHttpContext(ホスト);
    if (例外インスタンスBaseException) {
      this.getResponse(ctx).status(exception.statusCode).json({
        例外コード: exception.getExceptionCode(),
        メッセージ: exception.getErrorMessage(),
        パス: this.getRequest(ctx).url
      });
    }それ以外 {
      例外:
      this.getResponse(ctx).status(500).json({
        メッセージ: 「未処理の例外」、
        パス: this.getRequest(ctx).url
      });
    }

  }
}

新しい不正な例外ハンドラを作成します。

"@nestjs/common" から { ArgumentsHost、Catch } をインポートします。
"src/exceptions/auth.exception" から { AuthException } をインポートします。
「src/exceptions/base.exception」から BaseException をインポートします。
「./base.exception.filter」から BaseExceptionFilter をインポートします。

@Catch(認​​証例外)
AuthExceptionFilter クラスをエクスポートし、BaseExceptionFilter を拡張します。
{
  コンストラクタ(){
    素晴らしい();
    console.log("認証例外コンストラクターの初期化"+new Date().toISOString());
  }
  catch(例外: AuthException、ホスト: ArgumentsHost) {
    例外.例外コード=40002;
    console.log("認証例外実行"+new Date().toISOString());
    this.writeToClient(ホスト、例外);
  }

}

不正な例外処理クラスについての説明は次のとおりです。

  1. Authexception例外のみをキャッチするためのCatchアノテーションを追加しました。他のタイプの例外は処理されません。
  2. カスタム例外処理クラスBaseexceptionfilterを継承する

応用

例外処理クラスは、メソッド、コントローラー、またはグローバルに適用できます。同じコントローラーでも、複数のカスタム例外クラスを定義できます。

'@nestjs/common' から、Controller、ForbiddenException、Get、HttpException、HttpStatus、UseFilters } をインポートします。
'./app.service' から { AppService } をインポートします。
'./exceptions/auth.exception' から { AuthException } をインポートします。
'./exceptions/business.exception' から BusinessException をインポートします。
'./exceptions/uncauht.exception' から UnCauhtException をインポートします。
'./filters/auth.exception.filter' から { AuthExceptionFilter } をインポートします。
'./filters/business.exception.filter' から BusinessExceptionFilter をインポートします。


/**
 * 単一のルートを持つ基本的なコントローラの例
 */
@UseFilters(AuthExceptionFilter、ビジネス例外フィルタ)
@コントローラ()
AppControllerクラスをエクスポートします。
 コンストラクター(プライベート読み取り専用 appService: AppService) {}

 @得る()
 getHello(): 文字列 {
  //新しいError("666")をスローします。
  新しい BusinessException("カスタム例外",HttpStatus.OK) をスローします。
  新しいAuthException()をスローします。
  新しい HttpException("カスタム例外",HttpStatus.FORBIDDEN) をスローします。
  this.appService.getHello() を返します。
 }

 @Get("名前")
 getName():文字列
 {
  「guozhiqi」を返します。
 }
}

いくつかの注意事項:

  1. 例外フィルターを追加するにはUsefiltersアノテーションを使用します
  2. Appcontrollerでは2種類のカスタム例外処理クラスを定義します。
  3. つまり、Appcontroller でスローされた例外は、定義した 2 つのタイプである限り、正常に処理できます。

いくつかの質問

Usefitlers のカスタム例外処理クラスは何回初期化されますか?
回答: タイプ別に AppController に登録するカスタム例外クラスは、プログラムの初期化時に 1 回だけ初期化されます。つまり、プログラムが開始すると、各

コントローラと各メソッドで定義される例外処理クラスが決定されました。
例外をキャッチしても何もしない場合はどうなるでしょうか?
回答: 例外処理メソッドが何もしない場合は、例外が処理されないため、ブラウザーの要求が正常にハングし、ブラウザーは応答を受け取りません。

複数の例外が処理される順序は何ですか?
回答: 複数の例外ハンドラーが例外をキャッチできる場合、最初のものだけが有効です。つまり、例外処理クラスはミドルウェアとは異なります。例外処理クラスの 1 つだけが例外を処理できますが、ミドルウェアは両方を処理する必要があります。

Nestjs の @Usefilters は誰に似ているでしょうか?
まず、JS の観点から見ると、Angular に似ています。バックエンドを見ると、Spring に最も似ています。

Nestjs の例外処理は複雑ではありません。複雑なのは、異なる種類の例外を処理し、例外の共通点を抽出する必要があることです。

参照ドキュメント: docs.nestjs.cn

これで、nestjs の例外フィルター Exceptionfilter の具体的な使用法に関するこの記事は終了です。nest 例外フィルター Exceptionfilter に関するその他の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • .Net Core で ExceptionFilter を使用する方法
  • asp.net core MVC グローバル フィルター ExceptionFilter フィルター (1)

<<:  MySQL 子テーブルで外部キー制約チェックを無効にする方法

>>:  MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装

推薦する

Reactはルーティングを使用してログインインターフェースにリダイレクトします

前回の記事では、webpack と react 環境を設定した後、ログイン インターフェースとその後...

HTMLフォーム入力監視の詳細な理解

今日、入力イベントに関するブログ投稿を見て、気まぐれで関連情報を整理してみました。イベント:関数 c...

MySQLの基本操作学習ノートテーブル

テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...

MySQL 匿名ログインでデータベースを作成できない問題の解決方法

よくある質問ユーザー ''@'localhost' によるデータベー...

単一の MySQL テーブル内の行数が 500 万を超えてはいけないのはなぜですか?

今日は、興味深いトピックについてお話ししましょう。データベースとテーブルを分割することを検討する前に...

MySQL 制約の種類と例

制約制約によりデータの整合性と一貫性が確保される制約はテーブルレベルの制約と列レベルの制約に分けられ...

エレガントなJSコードの書き方

目次変数意味があり発音しやすい変数名を使用する同じ型の変数には同じ語彙を使用する検索可能な名前を使用...

CSSを使用してHTMLテキストボックス内のテキストの垂直方向の中央を制御する

Text の height 属性が定義されている場合、Text に入力されたテキストは垂直方向に中央...

mysql8.0.11 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと...

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

CSSでフレックス配置を表示する(レイアウトツール)

display: flex レイアウトに関しては、深く理解している人もいますし、私も他の人の作業か...

nginx を使用して特定のインターフェース (URL) をブロックする方法

1. はじめに場合によっては、Web プラットフォームがオンラインになった後、サービス インターフェ...

Ubuntu での MySQL および MySQL Workbench のインストール チュートリアル

Ubuntu に jdk をインストールする: [リンク] UbuntuにEclipseをインストー...

CSSポジションの5つの異なる値の使い方の詳細な説明

位置プロパティposition プロパティは、要素に使用する配置方法のタイプ (静的、相対的、固定、...