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
}
これらの活用をすることで、エラー群ごとに別々の処理を挟むことができます。
便利ですね