高瀬博道の技術ブログ

高瀬博道の技術ブログです。

もう2023年になったので、今さらNestJSに入門しようと思う - その3

前回

takasehiromichiex.com

コントローラ

コントローラは、アプリケーションに対する特定の要求を受け取ります。コントローラは、複数のルーティングを持ちます。

src/cats/cats.controller.tsを編集してみましょう。

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

@Controller('cats')
export class CatsController {
    @Get()
    hello(): String {
        return "hello!";
    }
}

まず、@Get()デコレータを追加しました。 (HTTPリクエストメソッドデコレータ)

これで、このコントローラはGetリクエストを受け付けるようになります。

HTTPリクエストメソッドデコレータには引数を与えていないので、ルートパスに対応します。

ルートパスは、@Controller('cats')から、/catsになり、@Get()から、/cats/になります。

npm run start または、npm run start:dev を実行してから、postmanで、GET localhost:3000/catsを呼ぶと、以下のように返却されます。

hello!

@Controller()の引数の文字列によって、そのコントローラにおけるルーティングのプレフィックスをつけることができます。

@Get()の引数の文字列によって、そのメソッドにおけるルーティングのパスを指定することができます。

@Get()の引数ありのバージョンも作成してみましょう。

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

@Controller('cats')
export class CatsController {
    @Get()
    hello(): String {
        return "hello!";
    }

    @Get('goodbye')
    goodbye(): String {
        return "goodbye!";
    }
}

postmanで、GET localhost:3000/cats/goodbyeを呼ぶと、以下のように返却されます。

goodbye!

コントローラでリクエストを受け取る

メソッドで、リクエストを受け取れるようにします。

src/cats/cats.controller.ts
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller('cats')
export class CatsController {
    @Get()
    hello(@Req() request: Request): Request {
        return request;
    }

    @Get('goodbye')
    goodbye(): String {
        return "goodbye!";
    }
}

helloメソッドの引数に、@Req() request: Requestを追加しました。

これで、helloメソッドが呼ばれた際のリクエストを取得できます。

しかし、ほとんどの場合、requestをそのまま使うことはありません。

そのため、以下のデコレータを使用することができます。

  • @Request(), @Req()
    • req
  • @Response(), @Res()
    • res
  • @Next()
    • next
  • @Session()
    • req.session
  • @Param(key?: string)
    • req.params / req.params[key]
  • @Body(key?: string)
    • req.body / req.body[key]
  • @Query(key?: string)
    • req.query / req.query[key]
  • @Ip()
    • req.ip
  • @HostParam()
    • req.hosts

まとめ

ここまでで、

  • コントローラのルーティングプレフィックス
  • コントローラのルーティングパス
  • コントローラのリクエストデコレータ

を学びました。

次回は、コントローラをより掘り下げようと思います。

コード

現時点のコードは以下に格納しました。

github.com

takasehiromichiex.com