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 テーブルを削除するときに外部キー制約を無視するシンプルな実装

推薦する

Tomcat が https アクセスをサポートするための手順の説明

tomcat を https アクセスに対応させる方法ステップ: (1)キーストアファイルを生成する...

Linuxで$を#に変更する方法

このシステムでは、# 記号は root ユーザーを表し、$ 記号は通常のユーザーを表します。では、ど...

Docker コンテナのタイムゾーン エラーの問題

目次背景質問問題分析と解決策新たな問題問題分析と解決策背景node-schedule スケジュール ...

MySQL で準備、実行、割り当て解除ステートメントを使用するチュートリアル

序文MySQLでは、準備、実行、割り当て解除を正式にはPREPARE STATEMENTと呼びます。...

小規模プロジェクトで Vue が点滅するのを防ぐ方法

まとめHTML: 要素と v-cloak CSS: [v-cloak]{表示: なし}プロセスページ...

MySQL Community Server 8.0.12 のインストールと設定方法のグラフィックチュートリアル

MySQL 8 は、NoSQL、JSON などのサポートなど、まったく新しいエクスペリエンスをもたら...

JavaScript が重複したネットワークリクエストを防ぐ方法の例

序文開発中は、インターフェース要求の繰り返しによってさまざまな問題が発生することがよくあります。ネッ...

CSSは高さを設定せずにdivを完全に中央に配置することを実現します

必要とする本文の下のdivは垂直方向に中央揃えになっていますdiv 内のテキストを垂直中央に配置する...

mysql binlog (バイナリログ) を表示する方法

たとえば、新しいテーブルを作成したり、既存のテーブルのデータを更新したりすると、これらのイベントは、...

MySQL 作成ルーチン権限に関する注意事項

1. ユーザーにルーチン作成権限がある場合は、プロシージャ | 関数を作成できます。 2. ユーザー...

Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決する

以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...

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

この記事では、MySQL 5.7.20のインストールと設定方法を参考までに紹介します。具体的な内容は...

条件によるMysqlカウントの複数の実装方法を詳細に解説

最近、あるウェブサイトのバックエンドに一連の統計機能を追加していたのですが、条件によるカウントが必要...

VMwareがLinuxシステムをインストールして起動した後に黒い画面が表示される問題を解決する

1. 設置環境1. HUAWEI mate x CPU i5 82500u、8g メモリ、独立グラフ...

フォーム送信の更新ページはソースコード設計にジャンプしません

1. ソースコードの設計コードをコピーコードは次のとおりです。 <!DOCTYPE html ...