【NestJS入門】APIを構築するためのコントローラーの使い方まとめ

Posted: October 07, 2021

今回は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のコントローラーはデコレーターを用いることで、かなりコード量を削減した実装ができることが理解いただけたかと思います。
よければ引き続き記事をご覧ください。