Laravel経験者のNestJS入門【概要:例外フィルタ】

NestJSにおける例外フィルタに関するお勉強記録です。主に以下のページを見て学んだ内容になります。

Exception filters | NestJS - A progressive Node.js framework

例外の基本

まずは例外についての基本的なお話です。

キャッチしていない例外が発生した場合

NestJSはキャッチしていない例外が発生した場合、次の様なレスポンスを返します。

{ "statusCode": 500, "message": "Internal server error" }

スタンダードな例外のthrow

普通にExceptionをnewしてthrowするだけです。第1引数は何かしらのメッセージを、第2引数にはHTTPのステータスコードを渡します。

throw new HttpException("エラーメッセージ", HttpStatus.FORBIDDEN);

勝手にデータを生成して、クライアントには次の様なデータを返します。

{"statusCode":403,"message":"エラーメッセージ"}


以下の様に自分で用意したデータも返せます。

throw new HttpException({"foo":"bar"}, HttpStatus.FORBIDDEN);

次の様にシリアライズされて返ってきます。

{"foo":"bar"}


HttpExceptionを例にしましたが、NestJSではHttpExceptionを継承した以下の様な組み込みの例外クラスが用意されています。

  • BadRequestException
  • UnauthorizedException
  • NotFoundException
  • ForbiddenException
  • NotAcceptableException
  • RequestTimeoutException
  • ConflictException
  • GoneException
  • HttpVersionNotSupportedException
  • PayloadTooLargeException
  • UnsupportedMediaTypeException
  • UnprocessableEntityException
  • InternalServerErrorException
  • NotImplementedException
  • ImATeapotException
  • MethodNotAllowedException
  • BadGatewayException
  • ServiceUnavailableException
  • GatewayTimeoutException
  • PreconditionFailedException

例外フィルタ

例外をカスタマイズする仕組みです。特定の例外が発生した時だけ特別な処理を実施したりできます。

例外フィルタの作成

NestJSでは以下のコマンドで例外フィルタを作成できます。

nest g filter common/filter/http-exception

作成した直後はこんな感じです。

これを以下の様に書き換えます。HttpExceptionが発生したらレスポンスにステータスコード、タイムスタンプ、パスを返すようにカスタマイズしてますが、ここでは内容はさして重要ではありません。

cats.controller.tsで使ってみます。@nestjs/commonからuseFiltersをインポートし、create()メソッドと紐づけています。

これでcatsルートへPostすると次の様にhttp-exception.filter.tsで処理された結果が返ってきます。

{"statusCode":403,"timestamp":"2022-05-12T08:31:27.454Z","path":"/cats"}

他にもあれこれ解説されていましたがあまり使わなさそうなので割愛します。一応サンプルコードを置いておきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です