2019/08/09 このエントリーをはてなブックマークに追加 はてなブックマーク - NestJSのエラーハンドリングってどうやるの

NestJSのエラーハンドリングってどうやるの

カテゴリ: , ,






NestJSとはTypeScriptで書かれたnodeのサーバーサイドのフルスタックな感じのフレームワークです。
どことなくどこかで見たことある感じのフレームワークなので使いやすい感じはあります。
(いろんな言語の某フレームワークや別の某フレームワークに似ているとか感じると思います)

https://github.com/nestjs/nest


NestJSってエラーハンドリングどうするのがいいんだろう?
Catchアノテーションというのがあるらしいけどどういうものなんでしょう(大体想像つくけど)
そのあたりを調べてみます。


これ
https://docs.nestjs.com/exception-filters


NestJSにはCatchアノテーションというのがあるらしい。
と思って調べてみると
exception-filtersという機能らしい。

https://docs.nestjs.com/exception-filters
(これ以降、上記リンクの情報の方が詳しいので、そっち読んだ方が早いよって人は読み飛ばし推奨)

JavaScriptの世界ってExceptionないやろ、と思いつつ。
NestJSは以下のExceptionを提供する。
HttpStatusExceptionのサブクラス的なものだと思う。

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

これらはCatchアノテーションでハンドル可能。
例えば、@Catch(NotFoundException) とmethodヘッダーに宣言すれば、
特定のNotFoundExceptionに対してハンドル出来るはず。
@Catch()だと全部のExceptionを受け取るらしい(unhandled exception)。
Exceptionは自作することも可能。

ExceptionFilterというインターフェースがある。
ExceptionFilterをimplementsすることで
Exception発生時にFilterを差し込むことができる。


@Catch(HttpException) 
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    const status = exception.getStatus();
    response
       .status(status)
      .json({
          statusCode: status,
          timestamp: new Date().toISOString(),
          path: request.url,
      });
    } 
}

というフィルターを作っていおいて

@UseFilters(HttpExceptionFilter)
とすれば、Exceptionハンドリングするフィルターを差し込めると。
これで汎用的なExceptionハンドリングが出来るという感じですね。

appに対してuseGlobalFiltersを指定すると良いらしい。

const app = await NestFactory.create(AppModule); 
app.useGlobalFilters(new HttpExceptionFilter());

でも、もっと細かく指定したい場合もあるでしょ?という場合は
useClassを使えばモジュール単位でフィルター適用が出来るらしい。


import { Module } from ‘@nestjs/common’;
import { APP_FILTER } from ‘@nestjs/core’;

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
    },
  ],
})
export class AppModule {}

  • CatchはNestJSのExceptionをハンドルする
  • UseFilterは任意の処理を差し込むことができる
  • ExceptionFilterにCatchを宣言することで任意のエラーハンドリングを差し込むことができる
  • useGlobalFiltersでアプリ単位、useClassでモジュール単位でフィルター適用可能
  • 大体ドキュメント読めば解決する https://docs.nestjs.com/



0 件のコメント:

コメントを投稿