Cách sử dụng bộ lọc ngoại lệ Nest.js để xử lý lỗi

Spread the love

Bộ lọc ngoại lệ của Nest.js cung cấp cách chặn và xử lý các ngoại lệ trên toàn cầu hoặc trên cơ sở từng bộ điều khiển.

Chúng cho phép bạn tập trung logic xử lý lỗi, định dạng phản hồi lỗi và cung cấp khả năng xử lý lỗi nhất quán trên ứng dụng của bạn. Tìm hiểu về các bộ lọc ngoại lệ và cách sử dụng chúng để xử lý các lỗi ứng dụng một cách thích hợp.

Xử lý lỗi mặc định trong Nest.js

Theo mặc định, Nest.js có một lớp ngoại lệ xử lý mọi trường hợp ngoại lệ mà mã ứng dụng của bạn không xử lý được.

Khi xảy ra lỗi chưa được xử lý trong ứng dụng của bạn, Nest.js sẽ phát hiện lỗi đó và trả về lỗi máy chủ nội bộ 500 cho máy khách. JSON mà Nest.js trả về trong trường hợp này trông như thế này:

 {
  "statusCode": 500,
  "message": "Internal server error"
}

Nếu đối tượng lỗi mà mã của bạn gửi có chứa mã trạng thái và thông báo thì Nest.js sẽ trả về các giá trị đó thay vì phản hồi mặc định.

Để tránh hành vi chung này và gửi phản hồi lỗi có ý nghĩa hơn cho khách hàng, bạn cần chăm chỉ xử lý tất cả các lỗi có thể xảy ra trong ứng dụng của mình. Bạn có thể đạt được điều này bằng cách sử dụng các bộ lọc ngoại lệ tùy chỉnh hoặc tích hợp sẵn của Nest.js.

Tạo bộ lọc ngoại lệ tùy chỉnh

Để minh họa quy trình tạo bộ lọc ngoại lệ tùy chỉnh, hãy thử tạo một bộ lọc sẽ xử lý tất cả các ngoại lệ HTTP.

  Giải quyết lỗi Visual Studio C++

Bắt đầu với một tệp có tên http.Exception.ts và thêm các mục nhập sau vào đó:

 import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
} from '@nestjs/common';

import { Request, Response } from 'express';

Những hàng nhập khẩu này phục vụ các mục đích sau.

  • ExceptionFilter: Đây là giao diện mô tả việc triển khai bộ lọc ngoại lệ.
  • Catch: Đây là công cụ trang trí đánh dấu một lớp là bộ lọc ngoại lệ Nest.
  • ArgumentsHost: Giao diện này cung cấp các phương thức để truy xuất các đối số được truyền cho trình xử lý. Nó cho phép bạn chọn bối cảnh thực thi thích hợp (ví dụ: HTTP, RPC hoặc WebSockets) để truy xuất các đối số từ đó.
  • HttpException: Đây là lớp xác định ngoại lệ Nest HTTP cơ sở.
  • Yêu cầu & Phản hồi: Đây là các giao diện tương ứng cho đối tượng yêu cầu và phản hồi Express.js.

Tiếp theo, tạo một lớp, HttpExceptionFilter, triển khai ExceptionFilter. Chú thích nó bằng trình trang trí Catch để cho biết rằng nó xử lý các ngoại lệ http:

 @Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {}

Tiếp theo, điền vào lớp mã này:

 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,
      message:
        exception.message
       || exception.getResponse()['message']
       || 'Internal Server Error',
    });
}

Khối mã này truy xuất các đối tượng yêu cầu và phản hồi từ đối tượng ArgumentsHost và trích xuất thông tin liên quan từ ngoại lệ. Nó trả về phản hồi đối tượng JSON có cấu trúc, kèm theo thông tin chi tiết về lỗi, cho máy khách.

Bộ lọc ngoại lệ ràng buộc

Bạn có thể liên kết bộ lọc ngoại lệ với bộ điều khiển hoặc toàn bộ ứng dụng của mình, tùy thuộc vào nhu cầu của bạn.

Để liên kết bộ lọc ngoại lệ trên toàn cầu, trước tiên hãy nhập bộ lọc ngoại lệ vào tệp main.ts của bạn. Sau đó, chuyển một phiên bản của bộ lọc ngoại lệ của bạn sang phương thức app.useGlobalFilters:

 
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './exception/http.exception';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(4050);
}

bootstrap();

Để liên kết một ngoại lệ với bộ điều khiển, hãy nhập trình trang trí UseFilters và bộ lọc ngoại lệ của bạn. Chú thích lớp trình điều khiển của bạn bằng trình trang trí @UseFilters và chuyển một phiên bản của bộ lọc ngoại lệ của bạn làm đối số cho trình trang trí:

 @Controller()
@UseFilters(new HttpExceptionFilter())
export class AppController {}

Nơi bạn liên kết bộ lọc sẽ xác định phạm vi xử lý lỗi của bạn. Các bộ lọc liên kết với bộ điều khiển sẽ chỉ phục vụ cho bộ điều khiển mà bạn đã liên kết với nó và các bộ lọc liên kết với ứng dụng sẽ phục vụ cho toàn bộ ứng dụng.

  Bạn có thể đăng nhập vào tài khoản PS4 của mình trên PS4 khác không?

Sử dụng ngoại lệ tích hợp để ném lỗi

Nest.js cung cấp các lớp ngoại lệ tích hợp mà bạn có thể sử dụng để xử lý lỗi.

Ví dụ: bạn có thể đưa ra lỗi mã trạng thái 404 bằng lớp NotFoundException:

   getUserById(id: number) {
    const user = users.find((user) => user.id === id);

    if (!user) {
      throw new NotFoundException({
        message: `User with id ${id} not found`,
      });
    }
  }

Khối mã này sử dụng câu lệnh có điều kiện để kiểm tra xem người dùng đã cho có tồn tại hay không. Nếu không, nó sẽ đưa ra lỗi 404 khi sử dụng NotFoundException, chuyển một thông báo làm đối số.

Các lớp ngoại lệ tích hợp phổ biến

Các lớp ngoại lệ tích hợp khác bao gồm nhưng không giới hạn ở các lớp sau.

  • BadRequestException: Ném ra một ngoại lệ cho biết yêu cầu không hợp lệ với mã trạng thái là 400. Bạn có thể sử dụng ngoại lệ này khi yêu cầu của khách hàng không hợp lệ hoặc không đúng định dạng và máy chủ không thể xử lý yêu cầu đó do lỗi của khách hàng. Nó thường ngụ ý rằng khách hàng cần sửa đổi yêu cầu để làm cho nó hợp lệ.
  • UnauthorizedException: Ném ra một ngoại lệ cho biết quyền truy cập trái phép có mã trạng thái là 401. Bạn có thể sử dụng ngoại lệ này khi người dùng không được xác thực hoặc thiếu các quyền cần thiết để truy cập tài nguyên.
  • ForbiddenException: Ném ra một ngoại lệ cho biết quyền truy cập bị cấm với mã trạng thái là 403. Bạn có thể sử dụng ngoại lệ này khi người dùng được xác thực nhưng không được phép thực hiện một hành động cụ thể.
  • RequestTimeoutException: Ném ra một ngoại lệ cho biết rằng yêu cầu đã hết thời gian chờ với mã trạng thái là 408. Bạn có thể sử dụng ngoại lệ này khi máy chủ chấm dứt yêu cầu vì mất quá nhiều thời gian để xử lý.
  • Xung độtException: Ném ra một ngoại lệ biểu thị xung đột với mã trạng thái 409. Bạn có thể sử dụng ngoại lệ này khi có xung đột giữa yêu cầu của khách hàng và trạng thái hiện tại của tài nguyên, chẳng hạn như khi cố gắng tạo tài nguyên đã tồn tại.
  • InternalServerErrorException: Ném ra một ngoại lệ cho biết lỗi máy chủ nội bộ với mã trạng thái là 500. Bạn có thể sử dụng ngoại lệ này khi xảy ra lỗi không mong muốn ở phía máy chủ, cho biết rằng máy chủ không thể thực hiện yêu cầu do sự cố nội bộ.
  Hướng dẫn cơ bản về phân tích khoảng cách nội dung

Các phương pháp hay nhất để xử lý lỗi trong Nest.js

Khi xử lý lỗi trong Nest.js, hãy nhớ sử dụng các bộ lọc ngoại lệ để bắt và xử lý các ngoại lệ trên toàn cầu hoặc trên mỗi bộ điều khiển. Bạn cũng có thể tạo bộ lọc tùy chỉnh cho các loại ngoại lệ cụ thể.

Ngoài ra, hãy đảm bảo bạn sử dụng các lớp ngoại lệ tích hợp thích hợp để đưa ra các lỗi phù hợp và có ý nghĩa. Những phương pháp này có thể cải thiện đáng kể độ tin cậy của ứng dụng Nest.js của bạn.

x