今回は NestJS のコントローラーの使い方を説明します。NestJS の環境構築はこちらの記事を参考にしてください。
コントローラーとは?
コントローラーはアプリケーションに対するリクエストを受け取り、特定のレスポンスを返します。NestJS ではクラスとデコレーターを用いてコントローラーを作成します。
ルーティング方法
それでは実際にコントローラーを実装してルーティングを設定してみましょう。
import { Controller, Get } from "@nestjs/common";
@Controller("api/author")
export class AuthorController {
@Get()
findAuthor(): string {
return "author1";
}
}
@Controller
アノテーションをつけることで対象のクラスをコントローラーとすることができ、その引数に共通のルートパスを設定します。
また、AuthorController
クラスのfindAuthor
メソッドに@Get
アノテーションを付与することで、GET リクエストに対応することができ、この例だと api/author に GET リクエストがきた際に、メソッドが呼び出されることになります。
そのため、アプリケーションを起動した場合は、プラウザで以下を開くと author1 と表示されます。
http://localhost:3003/api/author
そして findAuthor メソッドの戻り値が string や number などのリテラル型であった場合はそのままの値が返されるのですが、Object または配列を返す場合は自動的に JSON にシリアライズされて返されます。
メソッド単位のルーティング
また、@Get
アノテーションの引数にさらにパスを指定することもでき、上記の例を@Get("detail")
のようにすると、http://localhost:3003/api/author/detailにGETリクエストを送ることでメソッドが呼び出されることになります。
@Get("detail")
findAuthor(): string {
return "author1";
}
ワイルドカードでルーティング
以下のようにワイルドカードを使ってルーティングすることもできます。アスタリスクはなんらかの 1 文字を表すので、例えば http://localhost:3000/api/author/123 に GET リクエストを送ることができます。
@Get("1**")
findAuthor(): string {
return "author1";
}
パスパラメータを受け取る
エンドポイントのパスを動的なパラメータとして受け取りたい時は、@Get
アノテーションの引数に:id
のようにし、そのメソッドの引数で@Param
アノテーションを用いるとパスパラメータにアクセスすることができます。
以下の例だと、たとえばapi/author/1
に GET リクエストがきた場合、引数 params は id というプロパティをもつことになります。
import { Controller, Get, Param } from "@nestjs/common";
@Controller("api/author")
export class AuthorController {
@Get(":id")
findAuthor(@Param() params): string {
return `author${params.id}`;
}
}
また、@Param の引数にパスパラメータを指定することでオブジェクトではなく文字列でパスパラメータを受け取ることもできます。
findAuthor(@Param("id") id): string
リクエストを受け取る
リクエストオブジェクトを受け取りたい場合は、@Req()アノテーションをコントローラーのメソッドの引数に指定することで受け取ることができます。
@Get()
findAllAuthor(@Req() req): string {
return "all authors";
}
リクエストオブジェクトはクエリパラメータやパスパラメータ、ヘッダーなどを含んでおり、それらはここから示すように個別に受け取ることも可能です。
Query
@Query でクエリパラメータを受け取ります。同様に引数で特定のクエリを指定できます。以下だとapi/author?id=3
リクエストがくると、id には 3 が入ります。
@Get()
findAllAuthor(@Query("id") id): string {
Body
@Body
でリクエストボディを受け取ります。引数を指定することで特定のキーの値のみを取得できます。またここで初めて出ましたが、@Post
アノテーションは POST リクエストを受け付けることを意味します。
@Post()
createAuthor(@Body("name") name): string {
return "create author";
}
また、DTO クラスなどを定義することでリクエストボディの型を指定できます。
- author.dto.ts
export class AuthorDto {
id: number;
name: string;
}
- author.controller.ts
@Post()
createAuthor(@Body() author: AuthorDto): string {
return "create author";
}
レスポンス
ステータスコードの変更
NestJS のステータスコードは POST リクエストの 201 をのぞき、デフォルトで 200 です。ステータスコードを変更したい場合は@HttpCode
を使います。
@Get(":id")
@HttpCode(204)
findAuthor(@Param("id") id): string {
return `author${id}`;
}
header の指定
レスポンスにヘッダーをセットしたい場合は、@Header を使います。
@Get(":id")
@Header("Content-Type", "application/json")
findAuthor(@Param("id") id): string {
HTTP メソッド
NestJS は標準的な HTTP メソッドを全てデコレータで実現することができ、それぞれメソッド名がデコレータ名になっています。
@Get()
、@Post()
、@Put()
、@Delete()
、@Patch()
また、@All()
を用いることで全てのメソッドを受け付けることもできます。
モジュールに追加して利用できるようにする
NestJS ではただコントローラーを作るだけでは利用できず、モジュールに追加することで利用できるようになります。最後にモジュールへの追加方法を見ていきましょう。
非常に簡単で、@Module
の引数でオブジェクトとしてcontrollers
にクラスを追加するだけです。
import { Module } from "@nestjs/common";
import { AuthorController } from "src/presentation/author.controller";
@Module({
controllers: [AuthorController],
})
export class AuthorModule {}
NestJS のコントローラーはデコレーターを用いることで、かなりコード量を削減した実装ができることがわかってもらえたかと思います。
よければ引き続き次の NestJS 記事も見ていってください。