NestJS ルーティング実装方法

# はじめに
この記事では、NestJS の Controller のルーティング実装方法について記載します。

# 開発環境
開発環境は以下の通りです。

- Windows11
- VSCode
- Node.js 20.5.0
- NestJS 10.0.0
- TypeScript 5.1.3

# Controller とは
Controller は、クライアントからのリクエストを受け取り、レスポンスを返します。
また、ルーティング機能により、どの Controller に対するリクエストであるか制御することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/93ee18e2-f03a-878a-032a-da0cefe8c75c.png)
[^1]
[^1]:https://docs.nestjs.com/controllers

# 事前準備
以下の手順に沿って、NestJS をインストールします。

https://qiita.com/Yasushi-Mo/items/7c6e01a33c95f520453f

# Controller の基本的な実装
***クラス*** と ***デコレーター*** を利用して実装します。

```app.controller.ts
import { Controller, Get } from '@nestjs/common';

@Controller()
export class AppController {
  @Get()
  getRoot(): string {
    return 'RootController';
  }
}
```

上記の例では、```AppController``` クラスに ```@Controller()``` デコレーターを追加することで、このクラスを Controller にすることができます。
また、クラス内の ```getRoot()``` メソッドに ```@Get()``` デコレーターを追加することで、GET リクエストに対応することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/1165da3e-9fe0-306d-b8f3-586646f7d395.png)

:::note
Controller とそのテストファイルは、CLI で以下のコマンドを実行して作成することもできます。
```
nest g controller [name]
```
:::

# クラス単位のルーティング
```@Controller()``` デコレーターの引数にパスを指定することで、クラス単位で共通のルートパスを設定できます。

```app.controller.ts
import { Controller, Get } from '@nestjs/common';

@Controller('controllers')
export class AppController {
  @Get()
  getRoot(): string {
    return 'RootController';
  }
}
```
上記の例では、```@Controller()``` デコレーターに ```controllers``` というパスを設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/4f3a930f-7263-e538-5dd1-5375381f68e9.png)

# メソッド単位のルーティング
```@Get()``` デコレーターの引数にパスを指定することで、メソッド単位でもルーティングができます。

```app.controller.ts
import { Controller, Get } from '@nestjs/common';

@Controller('controllers')
export class AppController {
  @Get('method')
  getMethod(): string {
    return 'MethodController';
  }
}
```

上記の例では、 ```@Get()``` デコレーターに ```method``` というパスを設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/16519044-5b04-df0b-cc54-bd727e73e5b3.png)


# ワイルドカードを利用したルーティング
アスタリスクなどワイルドカードを利用したルーティングも可能です。

```app.controller.ts
import { Controller, Get } from '@nestjs/common';

@Controller('controllers')
  @Get('wild*card')
  getWildCard(): string {
    return 'WildCardController';
  }
}
```

上記の例では、パスが ```wild-card``` でも ```wild_ABC_card``` でも同じ結果を取得することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/cd375f99-7a50-c1d3-cecf-997024158626.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/2a479697-09d3-87cf-84e4-9ec7befe9590.png)


# パスパラメーターの受け取り
以下の実装をすることで、ルーティング（エンドポイント）のパスを動的なパラメーターとして受け取ることができます。
- ```@Get()``` デコレーターの引数にパラメータートークン（ex. ```:id```）を追加する
- メドッドの引数に ```@Param()``` デコレーターを追加する


```app.controller.ts
import { Controller, Get, Param } from '@nestjs/common';

@Controller('controllers')
export class AppController {
  @Get('path-parameters/:param')
  getPathParameters(@Param('param') param: string): string {
    return `PathParameter returns param: ${param}`;
  }
}
```

上記の例では、```route-parameters/:param``` の ```:param``` をパスパラメーターとして受け取っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/e6c21815-3bfc-4a3f-c0e7-b089e55da114.png)

# 参考
- [APIを構築するためのコントローラーの使い方まとめ](https://tyotto-good.com/nestjs/controller)
- [Controllers](https://docs.nestjs.com/controllers)