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

Posted: 2021/10/3
NestJS/
主要機能

今回は 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 記事も見ていってください。