高瀬博道の技術ブログ

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

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

前回

takasehiromichiex.com

例外フィルタ

例外フィルタは、Nest組み込みのレイヤーで、アプリケーション全体で未処理の例外を全て処理します。

アプリケーションコードによって例外が処理されない場合に、例外フィルタでキャッチされ、適切な応答が自動的に送信されます。

デフォルトでは、このアクションは組み込みのグローバル例外フィルタによって実行されます。

標準例外のスロー

Nestは、HttpExceptionクラスを提供します。

一般的なREST/GraphQL API ベースのアプリケーションでは、特定のエラー状態が発生した際に、標準のHTTP応答オブジェクトを送信することがベストプラクティスです。

標準例外をスローしてみましょう。

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

@Controller('cats')
export class CatsController {
    @Get()
    findAll() {
        throw new HttpException('Forbidden', HttpStatus.FORBIDDEN)
    }
}

postmanで、GET localhost:3000/catsを呼び出すと、http status code が403 Forbiddenの状態で、以下が返却されます。

{
    "statusCode": 403,
    "message": "Forbidden"
}

HttpExceptionメソッドは、responsestatusoptionを引数にとります。

responseは、stringまたはobejctで、JSON応答の本文になります。

statusは、numberを引数にとり、HTTPステータスコードを指定します。

optionは、オプショナルです。エラーをスローする原因となった内部エラーに関する情報を提供します。

responseにオブジェクトを使用した版を作成してみましょう。

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

@Controller('cats')
export class CatsController {
    @Get()
    findAll() {
        throw new HttpException(
            {
                status: HttpStatus.FORBIDDEN,
                error: 'error message...'
            }, 
            HttpStatus.FORBIDDEN,
            {
                cause: new Error('cause...')
            }
        );
    }
}

postmanで、GET localhost:3000/catsを呼び出すと、http status code が403 Forbiddenの状態で、以下が返却されます。

{
    "status": 403,
    "error": "error message..."
}

カスタム例外

多くの場合カスタム例外を作成する必要はないですが、もし仮に作成する必要がある場合は、以下のように作成します。

src/exception/custom.exception.ts
import { HttpException, HttpStatus } from "@nestjs/common";

export class CustomException extends HttpException {
    constructor() {
        super('custom', HttpStatus.FORBIDDEN);
    }
}
src/cats/cats.controller.ts
import { Controller, Get, HttpException, HttpStatus } from '@nestjs/common';
import { CustomException } from 'src/exception/custom.exception';

@Controller('cats')
export class CatsController {
    @Get()
    findAll() {
        throw new CustomException();
    }
}

postmanで、GET localhost:3000/catsを呼び出すと、http status code が403 Forbiddenの状態で、以下が返却されます。

{
    "statusCode": 403,
    "message": "custom"
}

まとめ

ここまでで、

  • 例外フィルタについて
  • 標準例外のスローについて
  • カスタム例外について

を学びました。

次回はもう少し例外フィルタについて掘り下げようと思います。

コード

今回のコードについては、以下に格納しました。

github.com

takasehiromichiex.com