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 テーブルを削除するときに外部キー制約を無視するシンプルな実装
目次序文ホットチェンジとはCocos Hot アップデートの概要マニフェストプロジェクトリソースとゲ...
本日、MySQLの圧縮版をインストールする際に問題が発生しました。サービスが起動できず、2、3時間苦...
みなさんこんにちは。今日は、MySQL 8.0.22 のインストールと構成について学習します。注意深...
Ubuntu 20.04 では、デフォルトで root ログインが有効になっていないため、デスクトッ...
1. スケジュールタスクを作成する命令crontab -eは現在のユーザーの編集インターフェースに入...
矢が放たれる前に、弓は矢にささやきました。「お前の自由は私のものだ。」スキーマは矢のようなもので、弓...
現象: MySQL バージョン 5.7 以降では、日付型と日付時刻型のデフォルト値が「0000-00...
背景同社のサーバーはすべて Alibaba Cloud ECS ホストを購入しています。デフォルトの...
主な違い: 1. タイプSQL データベースは主にリレーショナル データベース (RDBMS) とし...
Vue プロジェクトの開発プロセスでは、ローカル デバッグの利便性のため、通常、vue.config...
成果を達成するまずHTMLを使って基本的なフレームワークを構築します <本文> <...
CentOS プロジェクトは、Red Hat の再配布要件に完全に準拠した、Red Hat Ente...
今日は、Linux ホスト上で 4 つの MySQL データベースを起動する方法について説明します。...
外国のウェブサイトを開くと文字化けした文字が表示されることが多く、また、英語以外の外国のウェブサイト...
Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...