😀

[Nestjs] Webアプリの基本 コントローラーを実装する

2024/03/09に公開

概要

NestjsでHTTPリクエストを捌くコントローラーを作成する
以下の項目を考慮する

  • HTTPメソッドのルーティング
  • 正常処理時のレスポンス
  • 異常処理時のレスポンス

ルーティングと正常処理

Nestjsのコントローラーはデコレーターパターン(@で始まる)で機能を追加していく
以下ではGet /practiceを処理するためのコントローラーを作成している

[リクエスト]
クラスに@Contoller(path_name)をデコレートする事でパス /path_naneを拾うコントローラーが作成できる
そのクラスのメソッドに@Getをデコレートすることでhttpメソッド Getを拾って処理するハンドラが作成できる
メソッドの引数に@Query()を追加することでクエリストリングを拾う
他にも@BodyでBodyを扱うこともできる
以下のソースコードではtypeというクエリストリングを拾い,変数typeに割り当てている

[レスポンス]
メソッド内でnumberやstringなどのプリミティブ型をreturnするとそのままボディに入れてレスポンスを返す
また、javascriptオブジェクトをreturnすると, 自動的にJSONに変換してレスポンスボディに詰めて返す

以下のコントローラーのソースコードをnestjsモジュールに登録して実行すれば、以下のリンクにアクセスして動作を確認できる
http://localhost:3000/practice?type=number
http://localhost:3000/practice?type=string
http://localhost:3000/practice?type=object

import { Controller, Get, Query } from '@nestjs/common';

@Controller('practice')
export class AppController {

  @Get()
  getHello(@Query('type') type: string) {
    if (type === 'number') {
      return 123456789;
    }
    if (type === 'string') {
      return 'hoge moge poge';
    }
    if (type === 'object') {
      return {
        hoge: 'hoge',
        moge: 'moge',
        poge: 'poge',
      };
    }
  }

}

異常処理

以下では、例外処理の方法を実装する
正常時はreturnでレスポンスを返していたが、例外はthrowすることでレスポンスを返す
Nestjsでは例外用のクラスも用意されていて@nestjs/commonからimportし、400を返したいときはBadRequestException, 404を返したいときはNotFoundException, 自分で例外を作りたいときはHttpExceptionを使って作ることができる

以下のコントローラーのソースコードをnestjsモジュールに登録して実行すれば、以下のリンクにアクセスして動作を確認できる
http://localhost:3000/practice?code=400
http://localhost:3000/practice?code=404
http://localhost:3000/practice?code=500

import { Controller, Get, Query, HttpException, NotFoundException, BadRequestException, HttpStatus } from '@nestjs/common';

@Controller('practice')
export class AppController {
  @Get()
  getHello(@Query('code') code: string) {
    if (code === '400') {
      throw new BadRequestException();
    }
    if (code === '404') {
      throw new NotFoundException()
    }
    if (code === '500') {
      throw new HttpException('Internal Server Error', HttpStatus.INTERNAL_SERVER_ERROR)
    }
  }

}

Discussion