2024年版[NestJS] ドキュメントまとめ_個人用途

## 参考

https://docs.nestjs.com/

https://zenn.dev/kisihara_c/books/nest-officialdoc-jp/viewer

https://www.prisma.io/docs/orm/prisma-client/queries/crud#delete

## 予備知識

| 語句 | 説明 |
|:-:|:-:|
|  `アタッチ` |  付与 |
|  `プレフィックス` |  接頭辞 |
|  `メタデータ` |  追加の情報 |
|  `SIG` |  signal、信号 |
|  `Arguments` |  引数 |
|  `Exception` |  例外 |
|  `Forbidden` |  禁止の |
|  `ctx` |  Context、文脈 |
|  `bootstrap` |  自動実行する |

| 語句 | 説明 |
|:-:|:-:|
|  `シングルトン` |  シングルトン（Singleton）とは、あるクラスがインスタンス化される際に、そのクラスのインスタンスが一度だけ生成され、アプリケーション全体でその単一のインスタンスが共有されるデザインパターンのことです。 |
|  `ストリーム` |  時間順に並んだ進行中のイベントの列のことです。 |
|  `this` |  クラスのインスタンス自身を指します。thisを使用することで、そのクラス内のプロパティやメソッドにアクセスできます。 |
|   |   |

パラメータと引数の違い
| 語句 | 説明 |
|:-:|:-:|
|  `パラメータ` |  メソッドや関数が定義されるときに宣言される変数のことです。 |
|  `引数` |  メソッドや関数が呼び出されるときに渡される具体的な値のことです。 |

SOLID原則
| 頭文字 | 語句 | 説明 |
|:-:|:-:|:-:|
|  S |  単一責任の原則 (SRP) |  クラスは一つのことを正しく行います。 |
|  O |  開放/閉鎖の原則 (OCP) |  コードの修正なしに拡張できるようにします。 |
|  L |  リスコフの置換原則 (LSP) |  サブクラスは基本クラスの代替となるべきです。 |
|  I |  インターフェース分離の原則 (ISP) |  必要な機能のみを持つインターフェースを使用します。 |
|  D |  依存性逆転の原則 (DIP) |  具体的な実装ではなく、抽象に依存します。 |

## OVERVIEW
### Firststeps

|  順番 | コマンド | 説明 |
|:-:|:-:|:-:|
|  1 |  `npm i -g @nestjs/cli` |  CLIをインストールします。 |
|  2 |  `nest new project-name` |  プロジェクトを作成します。 |
|  3 |  `npm run start` |  アプリを起動します。 |

プラットフォームのデフォルトは、 **Express** です。

### Contorllers

- **ルーティング**

ハンドラに対するルートパスは、コントローラで宣言した（オプションの）接頭辞とリクエストデコレータで指定したパスを連結して決定されます。
送信されるHTTPリクエストによってハンドラが選択されます。そのため、パス自体が同じでも異なるハンドラを選択することができます。
```typescript
// @Req()デコレータを使用して、ExpressのRequest型のリクエストオブジェクトをメソッドのパラメータとして注入します。

@Get()
findAll(@Req() request: Request): string {
return 'This action returns all cats';
}
```
HTTPメソッドの各デコレータ
@Get()、 @Post()、 @Put()、 @Delete()、 @Patch()、 @Options()、 そして @Head()。加えて、@All()はこれら全てを処理するエンドポイントを定義しています。

- **ルートワイルドカード**
- **ヘッダ**

@Header()デコレータは、HTTPレスポンスに設定するヘッダの名前と値を引数として取ります。

- リダイレクト
- ルートパラメータ
- サブドメインルーティング
- **ペイロードのリクエスト**

`@Body()` デコレータは、HTTPリクエストのボディからデータを取得します。しかしその前に、DTOスキーマ（Data Transfer Object）を決定する必要があります。

- **非同期性**

全てのasync関数はPromiseを返す必要があります。

- 起動と実行

### Providers

- プロバイダ

プロバイダはNestJSの基本的な概念であり、サービス、リポジトリ、ファクトリ、ヘルパーなど、多くの基本的なクラスがプロバイダとして扱われます。プロバイダの主要な役割は、依存関係をインジェクションすることです。
プロバイダは、@Injectable()デコレータを前述したプレーンなJavaScriptのクラスです。

- 依存関係の注入

NestJSはDependency Injection（DI、依存性注入）という強力なデザインパターンを中心に構築されています。これにより、依存関係の管理が非常に簡単になります。

```typescript
// `constractor()` メソッドは、クラスのインスタンスを生成します。
constructor(private catsService: CatsService) {}
```

Angularの[*ドキュメント**](https://v17.angular.io/guide/dependency-injection)によると、DIシステムには、依存関係の消費者（dependency consumer）と依存関係の提供者（dependency provider）の2つの主要な役割があります。Angularは、これらの役割間の相互作用をインジェクタ（Injector）という抽象概念を使って促進します。

依存関係の注入(2)

- コンストラクタでの注入
最も一般的な方法は、クラスのコンストラクタに依存関係を宣言することです。Angularが新しいインスタンスを作成する際に、必要なサービスをコンストラクタの引数として渡します。

```typescript
@Component({ ... })
class HeroListComponent {
  constructor(private service: HeroService) {}
}
```
- inject メソッドの使用

もう一つの方法として、inject メソッドを使用することもできます。

```typescript
@Component({ ... })
class HeroListComponent {
  private service = inject(HeroService);
}
```
- スコープ

プロパイダは通常、アプリケーションのライフサイクルと同期したライフタイム（「スコープ」）を持っています。

- プロバイダの登録

モジュールファイル（app.module.ts）を編集し、@Module()デコレータのproviders配列にサービスを追加します。

### Modules

- モジュール
モジュールは、@Module()デコレータで装飾されたクラスで、Nestがアプリケーションの構造を整理するために使用するメタデータを提供します。各アプリケーションには、少なくとも1つのルートモジュールがあり、これはアプリケーションのツリー構造の出発点です。また、ルートモジュールは、app.module.tsファイルでAppModuleとして定義されています。

モジュールのプロパティ(4)
| プロパティ | 説明 |
|:-:|:-:|
|  providers |  モジュールで共有されるプロバイダ一覧です。 |
|  controllers |  モジュールで宣言されるコントローラ一覧です。 |
|  imports |  モジュールで必要な他のモジュール一覧です。 |
|  exports |  他のモジュールで使用されるプロバイダ一覧です。 |

- 機能モジュール

機能モジュールは、特定の機能に関連するコードを整理し、組織化して、明確な境界線を作ります。。これにより、特にアプリケーションやチームの規模が大きくなってきた時に、複雑さを管理しながらSOLID原則に基づいて開発できます。

- 共有モジュール

モジュールはシングルトンであるため、すべてのモジュールは自動的に共有モジュールとなります。一度作成されたモジュールは、全てのモジュールで再利用できます。

- グローバルモジュール

Angularのproviderはグローバルスコープに載り、一度定義すればどこでも利用できるものの、Nestではプロパイダがモジュールのスコープ内にカプセル化され、インポートしない限り他の場所では使えません。
どこでも利用可能でお手軽なプロバイダを提供したい場合、@Global()デコレータを使用してモジュールをグローバルに設定します。

- 動的モジュール

### Middleware

- ミドルウェア

プロバイダの1つです。

### Exceptionfilters


- 例外フィルタ
- スタンダードな例外のthrow

### Pipes

- パイプ

パイプは、コントローラのルートハンドラに渡される引数を処理します。メソッドが呼び出される直前にパイプが実行され、引数が変換・検証されます。パイプ -> コントローラの流れで処理されます。プロバイダの1つです。

パイプには以下の2つの主なユースケースがあります。
| ユースケース | 説明 |
|:-:|:-:|
|  変換 |  入力データを希望の形に変換します。 |
|  検証 |  入力データを評価し、データが正しければそのまま実行を続け、データが間違っていれば例外をthrowします。 |

- 組み込みパイプ

| 組み込みパイプ | 説明 |
|:-:|:-:|
|  ValidationPipe |   |
|  ParseIntPipe |   |
|  ParseBoolPipe |   |
|  ParseArrayPipe |   |
|  ParseUUIDPipe |   |
|  DefaultValuePipe |   |

- パイプのバインディング

```typescript
// @Paramデコレータは、URLからパラメータを抽出するために使用されます。この場合、URLの:id部分がidとして抽出されます。
// ParseIntPipeはパイプで、抽出されたidパラメータを整数に変換します。このパイプは、idが数値であることを保証し、数値に変換できない場合は例外を投げます。
// パイプによって変換されたidは、number型としてメソッドに渡されます。

@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
  return this.catsService.findOne(id);
}
```

### Guard

- ガード

ガードは@Injectable()デコレータで装飾されたクラスであり、プロバイダの1つです。ガードはCanActivateインターフェイスを実装する必要があります。また、ガードは認証や認可の目的で使用されます。

- 認可ガード
- ExecutionContext
- バインドするガード
- ハンドラごとのロールの設定

NestJSの@SetMetadata()デコレータは、カスタムメタデータをルートハンドラにアタッチするための機能を提供します。これは、特定のルートハンドラに追加情報を付加するために使用されます。

### Interceptors

- インターセプター

プロバイダの1つです。
- 呼び出しハンドラ

### Customroutedecorators

## FUNDAMENTALS

### Customproviders
### Asyncproviders

- 非同期プロバイダ

### Dynamicmodules

- 動的モジュール

### Injectionscopes
### Executioncontext
### Lifecycleevents
### Platformagnosticism
### Testing


## OPENAPI

### Operations

### `CRUD` 処理

| コマンド | 2 | 3 |
|:-:|:-:|:-:|
|  `prisma migrate --name <something>` |   |   |
|  `prisma migrate reset` |   |   |
|  `` |   |   |

| コマンド | 2 | 3 |
|:-:|:-:|:-:|
|  `nest g resource <複数形>` |   |   |