はじめに
こんばんはながたいちこです。
現在Nest.jsの学習をしています。
僕がぽんこつなこともありNest.jsの公式ドキュメントの内容がなかなか理解できず、
Nest.jsについての技術記事も少なかったため、
ChatGPTと翻訳などを駆使してなんとか学習を進めている状態です。
技術記事が少なかったので、
「ちょっとこの機会にかいちゃおうかな!」というモチベーションの記事です。
ただ、公式ドキュメントの書きうつしのような内容ではまた人が苦しむので、
私が学習中に困ったこととその解決について記載します。
なので詳細は基本的にリファレンス様を参照してください。
ModuleとController
問題
ここでの問題はModuleとcontrollerです。
個人的に馴染みが深いMVCやMVVMのモデル設計のせいなのか、
ModuleとControllerのどちらが親なのかイメージできませんでした。
システムは必ず1つ以上のルートModuleを持つと記載がありましたが、
controllerを持たないModuleが存在できるため、
ではModule単体でなにするんだ?など混乱しました。
解決
Moduleが親。
親と言っては語弊があるかもしれませんが、
ModuleはcontrollerやServiceと紐づいており、
実質ラッピングしているような設計と理解しました。
推奨する設計方針もなるべくModule単位で機能を作成すべしとあり、
以下の理解に誤りはなさそうです。
- Module=機能全体
- controller=機能のIF
- Service=ビジネスロジック
スコープの考え方
問題
スコープと聞くとPrivateやPublicのような関数や変数の公開範囲の話だと考えてしまい、
シングルトンがどうの、アクセスするたびにインスタンスが。。。
といった話が全くイメージできませんでした。
解決
変数の生存期間と同義でした。
- DEFAULT:アプリケーション全体でインスタンスを共有する
- REQUEST:ルートハンドラにアクセスするたびに作成し、使い終わったらガベージコレクションで消す。
- TRANSIENT:クラスがDIされるたびに新たなインスタンスを生成する。
基本的にはシングルトン(DEFAULT)で一度作成したインスタンスをシステム全体で共有する方法で問題ないそうです。
ペイロード
問題
色々書いてあるのですが、どういった場合に使うのか書いてないように感じました。
解決
端的にいうならルートハンドラ呼び出しの時に使える値オブジェクト。
DTOを作成し、ルートハンドラ呼び出し時のパラメータをDTOにキャストしてオブジェクトとして使用できるようにする。
PipeとProviderの違い
問題
Pipeを使用する場合とProviderを使用する場合の両方でクラスに@Injectable()をつけてくださいと説明があり、
PipeとProviderの違いがわかりませんでした。
解決
@Injectable()はDIによってクラスのインスタンス化ができるという意味。
インスタンス化したクラスの使いかたがPipeとProviderの違い
- Pip:データの変換、バリデーション
- Provider:サービス、リポジトリなどの機能を提供する。
middlewearとguard
問題
middlewearがなにする存在なのか、guardが何を守るのかわからなかった。
また、2つはクライアントとルーターの間に存在するのはわかるが、
前後関係についてはわからなかった。
解決
middlewearはルートハンドラにアクセスするときに特定の処理を実行する機能。
- リクエストログ
- ユーザー認証
- バリデーション
- エラーハンドリング
guardはmiddlewearのあとに存在する。
特定のルートへのアクセスを制御する。
リクエスト処理を実行すべきかどうかを決めます。
インターセプター
問題
かっこいい名前だけど何する機能なんだろ。。。
解決
observableでした。
ルートハンドラにアクセスした前後に処理を実行します。
- レスポンスの変換
- ログ
- 非同期処理の管理
終わり
以上です。
疑問を解決するのにChatGPTがとても役立ちました。
リファレンスの説明が理解できないとき、言い換えてもらったり、
かみ砕いてもらったりすることで内容の理解に役立ちます。
学習が進んだらまた何かしら書きます。