0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[NestJS]複数のExceptionFilterを使用する

Last updated at Posted at 2022-11-21

ExceptionFilterとは

NestJSでbuilt-inで例外を処理する機構が組み込まれていますが、例外クラスによって独自の処理を挟むことができます。

例:HttpException

例としてHttpExceptionを継承している全ての例外をキャッチするのが以下のようなExceptionFilterです。

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }

このように例外をCatchしたあと、ロガーを差し込んだり、レスポンスを好きな形に整形したりという便利なことができます。

NestJSのExceptionFilterで複数のFilterを使う

とはいえ、1つのExceptionFilterで書くと見ずらいことになってしまったり、クラスごとに違う処理を挟みたい場合がありますので調べた結果を共有します。

結論

以下の2つのExceptionFilterがあると想定します。

  • NotFoundFilter(NotFoundExecptionをCatchする)
  • GlobalErrorFilter(それ以外をCatchする)

要求としては、まずNotFoundをCatchし、それ以外はGlobalErrorFilterで処理したいとします。

その場合の記述方法は以下のようにします。

# メソッドレベルで設定する場合
@UseFilters(GlobalErrorFilter, NotfoundFilter)
//          ^^^ 2番目に実行される            ^^^ 最初に実行される

# globalに設定する場合
app.useGlobalFilters(new GlobalErrorFilter(), new NotfoundFilter());
         //          ^^^ 2番目に実行される            ^^^ 最初に実行される 

ちなみに、ExceptionFilterでは複数の例外を設定することができます

@Catch(ExceptionA, ExceptionB, ExceptionC)
export class ExampleExceptionFilter implements ExceptionFilter {
    // something
}

これらの活用をすることで、エラー群ごとに別々の処理を挟むことができます。

便利ですね:airplane_small:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?