Custom Exception Filter và Error Handling trong NestJS
- Published on
Giới thiệu
Trong NestJS, xử lý lỗi và ngoại lệ (Exception) là một phần không thể thiếu để xây dựng các ứng dụng ổn định và thân thiện với người dùng. Framework này cung cấp các Exception mặc định và cơ chế để bạn tự tạo Custom Exception và Exception Filter để kiểm soát lỗi một cách chi tiết.
Bài viết này sẽ hướng dẫn bạn:
- Các loại Exception mặc định trong NestJS.
- Cách tạo Custom Exception.
- Cách sử dụng Exception Filter.
- Cách tạo Custom Exception Filter và bắt Custom Exception.
Nội dung
- Giới thiệu
- Các Exception Mặc Định của NestJS
- Tạo Custom Exception
- Exception Filter trong NestJS
- Bắt Custom Exception bằng Exception Filter
- Kết luận
Các Exception Mặc Định của NestJS
NestJS cung cấp một số Exception mặc định, chủ yếu kế thừa từ HttpException
, để xử lý các lỗi HTTP phổ biến. Một số loại phổ biến bao gồm:
HttpException
HttpException
là lớp cơ bản cho các ngoại lệ HTTP. Bạn có thể sử dụng lớp này để tạo các ngoại lệ HTTP với mã trạng thái và thông báo cụ thể.
import { HttpException, HttpStatus } from '@nestjs/common';
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
Các ngoại lệ mặc định
NestJS cung cấp các lớp ngoại lệ được định nghĩa sẵn:
- BadRequestException: HTTP 400
- UnauthorizedException: HTTP 401
- ForbiddenException: HTTP 403
- NotFoundException: HTTP 404
- InternalServerErrorException: HTTP 500
Ví dụ:
import { NotFoundException } from '@nestjs/common';
throw new NotFoundException('Resource not found');
Tạo Custom Exception
Nếu các Exception mặc định không đáp ứng được yêu cầu của bạn, bạn có thể tạo các ngoại lệ tùy chỉnh bằng cách kế thừa HttpException
.
Ví dụ: Custom Exception
import { HttpException, HttpStatus } from '@nestjs/common';
export class CustomForbiddenException extends HttpException {
constructor(resource: string) {
super({
statusCode: HttpStatus.FORBIDDEN,
message: `${resource} is forbidden`,
}, HttpStatus.FORBIDDEN);
}
}
Sử dụng trong Controller
import { Controller, Get } from '@nestjs/common';
import { CustomForbiddenException } from './custom-forbidden.exception';
@Controller('resources')
export class ResourcesController {
@Get()
getForbiddenResource() {
throw new CustomForbiddenException('This resource');
}
}
Exception Filter trong NestJS
Exception Filter là gì?
Exception Filter là một cơ chế để bắt và xử lý các ngoại lệ được ném ra trong ứng dụng. NestJS cung cấp một số bộ lọc mặc định, nhưng bạn có thể tạo các bộ lọc tùy chỉnh để kiểm soát cách lỗi được xử lý.
Tạo Custom Exception Filter
Bước 1: Tạo File Exception Filter
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch(HttpException)
export class CustomHttpExceptionFilter 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();
const exceptionResponse = exception.getResponse();
const message = typeof exceptionResponse === 'string' ? exceptionResponse : exceptionResponse['message'];
response.status(status).json({
statusCode: status,
message,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
Bước 2: Áp dụng Custom Exception Filter
Áp dụng ở cấp Controller
import { Controller, Get, UseFilters } from '@nestjs/common';
import { CustomHttpExceptionFilter } from './custom-http-exception.filter';
@Controller('example')
@UseFilters(CustomHttpExceptionFilter)
export class ExampleController {
@Get()
throwError() {
throw new Error('This is a generic error');
}
@Get('http-error')
throwHttpException() {
throw new HttpException('This is an HTTP exception', 400);
}
}
Áp dụng ở cấp toàn cục
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { CustomHttpExceptionFilter } from './custom-http-exception.filter';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new CustomHttpExceptionFilter());
await app.listen(3000);
}
bootstrap();
Bắt Custom Exception bằng Exception Filter
Custom Exception Filter có thể được sử dụng để bắt các ngoại lệ tùy chỉnh.
Tạo Custom Filter Bắt Custom Exception
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { CustomForbiddenException } from './custom-forbidden.exception';
import { Response } from 'express';
@Catch(CustomForbiddenException)
export class CustomForbiddenExceptionFilter implements ExceptionFilter {
catch(exception: CustomForbiddenException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
const exceptionResponse = exception.getResponse();
response.status(status).json({
...exceptionResponse,
timestamp: new Date().toISOString(),
});
}
}
Sử dụng Filter
import { Controller, Get, UseFilters } from '@nestjs/common';
import { CustomForbiddenException } from './custom-forbidden.exception';
import { CustomForbiddenExceptionFilter } from './custom-forbidden-exception.filter';
@Controller('custom-errors')
@UseFilters(CustomForbiddenExceptionFilter)
export class CustomErrorsController {
@Get()
throwCustomForbiddenError() {
throw new CustomForbiddenException('Custom resource');
}
}
Kết luận
- Exception mặc định của NestJS giúp xử lý các lỗi phổ biến như HTTP 400, 404, 500.
- Custom Exception giúp bạn tùy chỉnh logic xử lý và thông điệp lỗi.
- Exception Filter cho phép bạn chuẩn hóa và mở rộng cách ứng dụng xử lý lỗi, đặc biệt khi kết hợp với Custom Exception.
Hãy áp dụng các công cụ trên để đảm bảo ứng dụng của bạn không chỉ ổn định mà còn dễ dàng bảo trì và mở rộng!
Nguồn: NestJS Documentation