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 テーブルを削除するときに外部キー制約を無視するシンプルな実装
目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...
公式サイトからダウンロードしたmysql-8.0.19-winx64 Windows (x86、64...
目次最初にコールバック関数を使用するes6 非同期処理モデルこの非同期モデルに合わせたAPI: pr...
序文職場で次のような状況に遭遇しました。ログ システムのテーブルでは、時間フィールドには日付データで...
MySQL では、LOAD_FILE() 関数はファイルを読み取り、その内容を文字列として返します。...
目次1. CentOS7+MySQL8.0、yumソースインストール2. MySQLにログインしてパ...
目次1. フロントエンド制御1. router.js ファイル内 (router.js にそれぞれ静...
序文Linux サーバーを操作および管理するときに、最もよく使用されるコマンドの 1 つが nets...
ウェブページを作成するときに、フォームを挿入した後、フォームの上下に空白行が表示されることがよくあり...
1. 機能: 親コンポーネントが子コンポーネントの指定された位置に HTML 構造を挿入できるように...
lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログ...
最近、React Hooks を zarm コンポーネント ライブラリと組み合わせて使用し、js...
今日、slave_exec_modeというパラメータを偶然見ました。マニュアルの説明から、このパラメ...
昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...
目次予防必要条件AWSアカウントを申請する仮想マシンの申請と有効化仮想マシンを申請するセキュリティグ...