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(ホスト、例外); } } 不正な例外処理クラスについての説明は次のとおりです。
応用例外処理クラスは、メソッド、コントローラー、またはグローバルに適用できます。同じコントローラーでも、複数のカスタム例外クラスを定義できます。 '@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」を返します。 } } いくつかの注意事項:
いくつかの質問 Usefitlers のカスタム例外処理クラスは何回初期化されますか? コントローラと各メソッドで定義される例外処理クラスが決定されました。 複数の例外が処理される順序は何ですか? Nestjs の @Usefilters は誰に似ているでしょうか? Nestjs の例外処理は複雑ではありません。複雑なのは、異なる種類の例外を処理し、例外の共通点を抽出する必要があることです。 参照ドキュメント: docs.nestjs.cn これで、nestjs の例外フィルター Exceptionfilter の具体的な使用法に関するこの記事は終了です。nest 例外フィルター Exceptionfilter に関するその他の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL 子テーブルで外部キー制約チェックを無効にする方法
>>: MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装
前回の記事では、webpack と react 環境を設定した後、ログイン インターフェースとその後...
今日、入力イベントに関するブログ投稿を見て、気まぐれで関連情報を整理してみました。イベント:関数 c...
テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...
1. MySQLを削除する a. sudo apt-get autoremove --purge m...
よくある質問ユーザー ''@'localhost' によるデータベー...
今日は、興味深いトピックについてお話ししましょう。データベースとテーブルを分割することを検討する前に...
制約制約によりデータの整合性と一貫性が確保される制約はテーブルレベルの制約と列レベルの制約に分けられ...
目次変数意味があり発音しやすい変数名を使用する同じ型の変数には同じ語彙を使用する検索可能な名前を使用...
Text の height 属性が定義されている場合、Text に入力されたテキストは垂直方向に中央...
mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと...
1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...
display: flex レイアウトに関しては、深く理解している人もいますし、私も他の人の作業か...
1. はじめに場合によっては、Web プラットフォームがオンラインになった後、サービス インターフェ...
Ubuntu に jdk をインストールする: [リンク] UbuntuにEclipseをインストー...
位置プロパティposition プロパティは、要素に使用する配置方法のタイプ (静的、相対的、固定、...