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

推薦する

TypeScript ジェネリックを簡単に説明する方法

目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...

JS ES6 非同期ソリューション

目次最初にコールバック関数を使用するes6 非同期処理モデルこの非同期モデルに合わせたAPI: pr...

MySQL でタイムスタンプを日付に変換する例

序文職場で次のような状況に遭遇しました。ログ システムのテーブルでは、時間フィールドには日付データで...

MySQL LOAD_FILE() 関数メソッドの概要

MySQL では、LOAD_FILE() 関数はファイルを読み取り、その内容を文字列として返します。...

VMware Workstation16 と Navicat リモート接続での Centos7 での MySQL8.0 インストール プロセス

目次1. CentOS7+MySQL8.0、yumソースインストール2. MySQLにログインしてパ...

Vueは動的ルーティングの詳細を実装します

目次1. フロントエンド制御1. router.js ファイル内 (router.js にそれぞれ静...

Linux の運用と保守で netstat の代わりに ss コマンドを使用する方法

序文Linux サーバーを操作および管理するときに、最もよく使用されるコマンドの 1 つが nets...

上下に空白行があるフォームを挿入する解決策

ウェブページを作成するときに、フォームを挿入した後、フォームの上下に空白行が表示されることがよくあり...

Vueスロットの詳細な説明

1. 機能: 親コンポーネントが子コンポーネントの指定された位置に HTML 構造を挿入できるように...

MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログ...

Reactフックとzarmコンポーネントライブラリ構成に基づいてh5フォームページを開発するためのサンプルコード

最近、React Hooks を zarm コンポーネント ライブラリと組み合わせて使用​​し、js...

MySQLのslave_exec_modeパラメータの詳細な説明

今日、slave_exec_modeというパラメータを偶然見ました。マニュアルの説明から、このパラメ...

HTML での位置の使用に関する簡単な紹介

昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...

AWS無料サーバーアプリケーションとネットワークプロキシ設定チュートリアルの詳細な説明

目次予防必要条件AWSアカウントを申請する仮想マシンの申請と有効化仮想マシンを申請するセキュリティグ...