0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng Dẫn Sử Dụng Middleware Trong NestJS: Quản Lý Yêu Cầu HTTP Hiệu Quả

Đăng vào 2 tuần trước

• 4 phút đọc

Giới thiệu

Chào mừng các bạn đã quay lại với bài viết tiếp theo trong chuỗi chủ đề về NestJS. Trong bối cảnh phát triển ứng dụng web hiện đại, việc quản lý và xử lý các yêu cầu HTTP là một khía cạnh cực kỳ quan trọng. Middleware trong NestJS không chỉ là công cụ mạnh mẽ giúp bạn thực hiện các tác vụ trước khi yêu cầu được xử lý bởi controller mà còn cung cấp cách tiếp cận hiệu quả để kiểm soát và quản lý yêu cầu.

Middleware Là Gì?

Middleware là một phần của ứng dụng nhận và xử lý yêu cầu trước khi nó đến controller. Bạn có thể sử dụng middleware để thực hiện các nhiệm vụ như xác thực người dùng, ghi log thông tin, xử lý lỗi, hoặc thậm chí thay đổi đối tượng yêu cầu. Nhờ vào middleware, bạn có thể tối ưu hóa quy trình xử lý yêu cầu và tăng cường khả năng bảo mật cho ứng dụng.

Cấu Trúc Middleware Trong NestJS

Trong NestJS, middleware có thể được định nghĩa dưới dạng class hoặc function. Dưới đây là hướng dẫn chi tiết từng cách:

Định Nghĩa Middleware Dưới Dạng Class

1. Tạo Class Middleware

typescript Copy
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggingMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`Incoming Request: ${req.method} ${req.url}`);
    next();
  }
}

Trong ví dụ trên, LoggingMiddleware sẽ ghi log thông tin của yêu cầu HTTP và gọi next() để chuyển tiếp yêu cầu đến middleware tiếp theo hoặc controller.

2. Đăng Ký Middleware Trong Module

typescript Copy
import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { LoggingMiddleware } from './logging.middleware';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggingMiddleware)
      .forRoutes('*'); // Áp dụng cho tất cả các route
  }
}

Định Nghĩa Middleware Dưới Dạng Function

Ngoài việc sử dụng class, bạn cũng có thể định nghĩa middleware dưới dạng function. Đây là cách đơn giản và nhẹ nhàng hơn, rất thích hợp cho các tác vụ cơ bản.

1. Tạo Middleware Dưới Dạng Function

typescript Copy
import { Request, Response, NextFunction } from 'express';

export function requestTimeMiddleware(req: Request, res: Response, next: NextFunction) {
  console.log(`Request Time: ${Date.now()}`);
  next();
}

2. Đăng Ký Middleware Dưới Dạng Function Trong Module

typescript Copy
import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { requestTimeMiddleware } from './request-time.middleware';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(requestTimeMiddleware)
      .forRoutes('*'); // Áp dụng cho tất cả các route
  }
}

Luồng Xử Lý Middleware Trong NestJS

Để hiểu rõ hơn cách middleware hoạt động, hãy xem xét luồng xử lý của một yêu cầu HTTP thông qua các middleware:

  1. Khi một yêu cầu đến, nó được chuyển đến middleware đầu tiên.
  2. Mỗi middleware thực hiện tác vụ của nó và gọi hàm next() để tiếp tục đến middleware tiếp theo.
  3. Sau khi tất cả middleware đã hoàn thành, yêu cầu được chuyển đến controller để xử lý.
  4. Controller trả về phản hồi cho client.

Các Tùy Chọn Cấu Hình Middleware

NestJS cung cấp nhiều tùy chọn để cấu hình middleware, giúp bạn có thể áp dụng middleware cho các route và phương thức HTTP cụ thể:

  • Áp dụng cho các route cụ thể:
typescript Copy
consumer.apply(LoggingMiddleware).forRoutes('cats'); // Áp dụng cho route /cats
  • Áp dụng cho cả phương thức HTTP cụ thể:
typescript Copy
consumer.apply(LoggingMiddleware).forRoutes({ path: 'cats', method: RequestMethod.GET }); // Áp dụng cho phương thức GET của route /cats
  • Áp dụng cho nhiều route:
typescript Copy
consumer.apply(LoggingMiddleware).forRoutes({ path: 'cats', method: RequestMethod.ALL }, { path: 'dogs', method: RequestMethod.ALL }); // Áp dụng cho cả hai route

Kết Hợp Middleware Với Guards Và Interceptors

Middleware có thể được kết hợp với guards và interceptors, tạo ra một hệ thống xử lý yêu cầu mạnh mẽ hơn.

  • Guards: Thực hiện kiểm tra xác thực và phân quyền.
  • Interceptors: Can thiệp vào quy trình xử lý yêu cầu, thực hiện các hành động cần thiết trước và sau khi xử lý yêu cầu.

Kết Luận

Việc hiểu và sử dụng middleware trong NestJS chính là chìa khóa giúp bạn quản lý các yêu cầu HTTP một cách hiệu quả. Qua bài viết này, hy vọng bạn đã nắm rõ cách thức hoạt động cũng như cách cấu hình middleware để phù hợp với nhu cầu của ứng dụng. Cảm ơn bạn đã theo dõi bài viết. Hẹn gặp lại trong các bài chia sẻ tiếp theo!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào