前提
NestJSとはTypeScriptで書かれたnodeのサーバーサイドのフルスタックな感じのフレームワークです。
どことなくどこかで見たことある感じのフレームワークなので使いやすい感じはあります。
(いろんな言語の某フレームワークや別の某フレームワークに似ているとか感じると思います)
https://github.com/nestjs/nest
NestJSのエラーハンドリングどうするの?
NestJSってエラーハンドリングどうするのがいいんだろう?
Catchアノテーションというのがあるらしいけどどういうものなんでしょう(大体想像つくけど)
そのあたりを調べてみます。
先に結論
これ
https://docs.nestjs.com/exception-filters
CatchアノテーションとかExceptionとか
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というインターフェースがある。
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 件のコメント:
コメントを投稿