Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

青灯夜游
リリース: 2022-03-21 20:12:57
転載
2763 人が閲覧しました

この記事では、バックエンド フレームワーク Nest.js の AOP アーキテクチャを理解し、Nest.js AOP アーキテクチャの利点を紹介します。皆様のお役に立てれば幸いです。

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すNest.js は

Nodejs

バックエンド フレームワークで、アーキテクチャ上の問題を解決するために Express などの http プラットフォームをカプセル化します。 MVC、IOC、AOP、および Express にはないその他のアーキテクチャ機能が提供され、コードの保守と拡張が容易になります。 ここでの MVC、IOC、AOP とは何を意味しますか?それぞれ見てみましょう:

MVC、IOC

MVC は Model View Controller の略です。 MVC アーキテクチャでは、リクエストはまずコントローラーに送信され、コントローラーはモデル層のサービスをディスパッチしてビジネス ロジックを完成させた後、対応するビューを返します。

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すNest.js は、コントローラーを宣言するための @Controller デコレーターを提供します。

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すこれにより、サービスは次のように装飾されます。宣言する @Injectable Decorator:

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す@Controller および @Injectable デコレータを通じて宣言されたクラスは Nest.js によってスキャンされ、対応するオブジェクトが作成されてコンテナに追加されます。このうち、コンストラクター内で宣言した依存関係に応じてオブジェクトが自動的に注入されるDI(依存性注入)という考え方をIOC(Inverse Of Control)と呼びます。

IOC アーキテクチャの利点は、オブジェクトを手動で作成し、依存関係に基づいてさまざまなオブジェクトのコンストラクターに渡す必要がなく、すべてが自動的にスキャン、作成、注入されることです。

さらに、Nest.js は、アスペクト指向プログラミングの機能である AOP (アスペクト指向プログラミング) の機能も提供します。

AOP

AOPとはどういう意味ですか?アスペクト指向プログラミングとは何ですか?

リクエストは、コントローラー、サービス、およびリポジトリ (データベース アクセス) のロジックを通過する場合があります。

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す一般的なロジックを追加する方法この通話リンクへ?ロギング、権限制御、例外処理など。

思いつきやすいのは、コントローラー層のコードを直接変換して、このロジックを追加することです。これは機能しますが、これらの一般的なロジックがビジネス ロジックに侵入するため、エレガントではありません。これらのビジネス ロジックにログや権限などを透過的に追加できますか?

コントローラーを呼び出す前後に共通ロジックを実行するステージを追加することは可能ですか?

例:

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すこのような水平展開ポイントはアスペクトと呼ばれ、いくつかのアスペクト ロジックを追加するこの透過的なプログラミング手法は AOP (アスペクト-指向性) プログラミング)。

#AOP の利点は、いくつかの共通ロジックをアスペクトに分離し、ビジネス ロジックを純粋に保つことができることです。このようにして、アスペクト ロジックを再利用したり、動的に追加および削除したりできます

実際、Express のミドルウェアのオニオン モデルも AOP 実装です。これは、外側の層を透過的にラップしてロジックを追加でき、内側の層はそれを認識しないためです。

Nest.js には AOP を実装するための方法が他にもあり、Middleware、Guard、Pipe、Inteceptor、ExceptionFilter:、

MiddlewareMiddleware

Nest を含む合計 5 つの方法があります。 js は当然 Express ベースのミドルウェアを使用できますが、グローバル ミドルウェアとルーティング ミドルウェアにさらに細分化されています:

グローバル ミドルウェアは Express のミドルウェアです。リクエスト前と処理ロジックを追加した後、各リクエストはここに移動します。 :

ルーティング ミドルウェアは特定のルートを対象としたもので、スコープはより小さくなります: Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

これは、直接Expressを継承し、さらにわかりやすくなりました。 Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

Guard などの Nest.js 拡張機能のいくつかの概念を見てみましょう:

Guard

Guard はルーティング ガードを意味し、コントローラーを呼び出す前に権限を決定するために使用できます。 . 、true または false を返してリリースするかどうかを決定します:

Guard の作成方法は次のとおりです: Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

Guard は CanActivate インターフェイスと canActive メソッドを実装する必要があります。コンテキストから要求された情報を取得し、true または false を返す前に権限の検証やその他の処理を実行できます。

@Injectable デコレータを介して IOC コンテナに追加し、コントローラで有効にします。

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

##コントローラ自体を変更する必要はありません。ただし、許可判定のロジックが透過的に追加されるのは、AOP アーキテクチャの利点です。

そして、ミドルウェアがグローバル レベルとルーティング レベルをサポートしているのと同じように、Guard もグローバルに有効にすることができます:

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

Guard はルーティングのアクセス制御ロジックを抽象化できます。ただし、リクエストとレスポンスは変更できません。この種のロジックではインターセプターを使用できます:

Interceptor

Interceptor はインターセプターを意味します。ターゲットのコントローラー メソッドの前後にロジックを追加できます:

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す##インテセプタを作成する方法は次のとおりです。

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すInterceptor NestInterceptor インターフェイスを実装するには、intercept メソッドを実装し、 call next.handle() 対象のコントローラーが呼び出され、その前後に処理ロジックを追加できます。

Controller の前後の処理ロジックは非同期である可能性があります。 Nest.js は rxjs を通じてそれらを整理するため、rxjs のさまざまな演算子を使用できます。

Interceptor は、特定のコントローラーにのみ影響する各ルートの個別の有効化をサポートします。また、すべてのコントローラーに影響するグローバルな有効化もサポートします:

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すルーティング許可制御や対象のController前後の処理は共通ロジックであることに加えて、パラメータの処理も共通ロジックであるため、Nest.jsでは該当する部分も抽出しました。 Pipe:

Pipe

Pipe はパイプラインを意味し、パラメーターの検証と変換を行うために使用されます:

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すPipe の作成方法は次のとおりです。このように:

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すPipe PipeTransform インターフェイスを実装するには、形式や型が正しいかどうかなど、受信パラメータ値の値に対してパラメータ検証を実行できる変換メソッドを実装します。正しくない場合は、例外をスローします。変換を実行し、変換された値を返すこともできます。

8 つの組み込みパイプがあり、その意味は名前からわかります:

    ValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • #ParseArrayPipe
  • ParseUUIDPipe
  • # DefaultValuePipe
  • ParseEnumPipe
  • ParseFloatPipe
  • 同様に、Pipe は特定のルートでのみ有効です。

1Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すパイプ、ガード、インターセプター、または最終的に呼び出されるコントローラーのいずれであっても、各ルートに対して有効になります。いくつかの例外をスローするプロセス中に使用できます。特定の例外に応答するにはどうすればよいですか?

この例外から応答へのマッピングも一般的なロジックです。Nest.js は、サポートする ExceptionFilter を提供します。 Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

ExceptionFilter

ExceptionFilter は、スローされた例外を処理し、対応する応答を返します。

ExceptionFilter の作成形式は次のとおりです。

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

まず、catch を実装することで、ExceptionFilter インターフェイスを実装します。メソッドを使用すると、例外をインターセプトできますが、インターセプトする例外は @Catch デコレーターで宣言する必要があります。例外をインターセプトした後、対応する例外で応答して、ユーザーによりわかりやすいプロンプトを表示できます。

もちろん、すべての例外が処理されるわけではありません。HttpException を継承する例外のみが ExceptionFilter によって処理されます。Nest.js には、HttpException の組み込みサブクラスが多数あります。

  • BadRequestException
  • UnauthorizedException
  • NotFoundException
  • ForbiddenException
  • ##NotAcceptableException
  • #RequestTimeoutException
  • ##ConflictException
  • ## GoneException
  • PayloadTooLargeException
  • UnsupportedMediaTypeException
  • UnprocessableException
  • InternalServerErrorException
  • #NotImplementedException
  • #BadGatewayException
  • ServiceUnavailableException
  • ##GatewayTimeoutException
  • もちろん、自分で拡張することもできます。
  • Nest.js は次のように実装されています。このように、例外と応答の対応関係があるため、コード内で異なる HttpException がスローされている限り、対応する応答が返されるため、非常に便利です。
同様に、ExceptionFilter もグローバルに有効にするか、特定のルートで有効にするかを選択できます:

特定のルート:

2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

グローバル:

Nest.js によって提供される AOP メカニズムは理解しましたが、それらの順序関係はどのようなものでしょうか?

複数の AOP メカニズムの順序2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

ミドルウェア、ガード、パイプ、インターセプター、および例外フィルターはすべて、特定の処理ロジックを特定のルートまたはすべてのルートに透過的に追加できます。これが AOP の利点です。

しかし、それらの間の順序関係は何でしょうか?

2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す呼び出し関係はソースコードによって異なります。

対応するソース コードは次のとおりです:

#明らかに、このルートに入ると、許可があるかどうかなどを判断するために Guard が最初に呼び出されます。 .、権限がない場合は、ここで例外がスローされます:

スローされた HttpException は、ExceptionFilter によって処理されます。

許可がある場合、インターセプターが呼び出されます。インターセプターはチェーンを編成し、1 つずつ呼び出し、最後にコントローラー メソッドを呼び出します: 2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

コントローラー メソッドを呼び出す前に、パイプを使用してパラメーターを処理します: 2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

各パラメーターは変換されます:

2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

ExceptionFilterの呼び出しタイミングは、例外を処理してから応答するというのが考えやすいです。

そしてミドルウェアというのはexpressの概念であり、Nest.jsはそれを継承するだけで最外層で呼び出されます。 2Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話す

これは、これらの AOP メカニズムの呼び出しシーケンスです。これらを整理すると、Nest.js を十分に理解できるようになります。

概要

Node.js Nest.js の AOP アーキテクチャを理解し、その利点について話すNest.js は、Express http プラットフォームに基づくカプセル化レイヤーであり、MVC、IOC、AOP、およびその他のアーキテクチャ上のアイデアを適用します。

MVC はモデル コントローラーとビュー コントローラーを分割したもので、リクエストは最初にコントローラーを通過し、次にモデル層のサービスとリポジトリを呼び出してビジネス ロジックを完成させ、最後に対応するビューを返します。

IOC とは、Nest.js が @Controller および @Injectable デコレーターを使用してクラスを自動的にスキャンし、それらのオブジェクトを作成し、依存関係に基づいて依存するオブジェクトを自動的に挿入することにより、手動での作成とアセンブリが不要になることを意味します。

AOP は一般的なロジックを抽出し、アスペクトを通じて特定の場所に追加するもので、アスペクト ロジックを再利用したり、動的に追加および削除したりすることができます。

Nest.js のミドルウェア、ガード、インターセプター、パイプ、例外ファイルはすべて AOP のアイデアの実装です。これらは異なる場所にある側面にすぎません。これらはすべて、特定のルートまたはすべてのルートに柔軟に適用できます。 AOP の利点です。

ソースコードから呼び出しシーケンスを確認しました。ミドルウェアはExpressの概念です。最外層では、特定のルートに到達した後、最初にGuardが呼び出されます。Guardは、ルートがルートに到達したかどうかを判断するために使用されます。アクセス許可が与えられると、コントローラーの前後にロジックを拡張するためにインターセプターが呼び出され、ターゲットのコントローラーに到達する前にパイプが呼び出され、パラメーターの検証と変換が行われます。すべての HttpException 例外は ExceptionFilter によって処理され、異なる応答を返します。

Nest.js は、この AOP アーキテクチャを使用して、疎結合で保守と拡張が容易なアーキテクチャを実現します。

AOP アーキテクチャのメリットを感じたことはありますか?

ノード関連の知識の詳細については、

nodejs チュートリアル

を参照してください。

以上がNode.js Nest.js の AOP アーキテクチャを理解し、その利点について話すの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート