Thiết kế Controller & HTTP Handlers
Trong kiến trúc NestJS, Controller đóng vai trò là “cửa ngõ” tiếp nhận toàn bộ các yêu cầu HTTP (HTTP Requests) gửi tới từ phía Client (trình duyệt, ứng dụng di động). Nhiệm vụ cốt lõi của nó là điều phối (route) yêu cầu, trích xuất tham số dữ liệu và chuyển tiếp cho tầng nghiệp vụ (Service) xử lý, sau đó trả về kết quả cho Client. Tài liệu này tổng hợp cấu trúc Controller, các decorator xử lý HTTP request thường dùng và hướng dẫn cách viết prompt để Claude Code sinh ra các Controller tối ưu nhất.1. Cấu trúc cơ bản của một Controller
Một Controller được định nghĩa bằng cách sử dụng@Controller() decorator đặt trên một Class. Bạn có thể truyền vào một chuỗi tiền tố đường dẫn (prefix route) để gom nhóm các endpoint có liên quan.
src/products/products.controller.ts
2. Các HTTP Method Decorator (Handlers)
Để gán một hành động HTTP cụ thể vào một phương thức trong Controller, NestJS cung cấp các decorator tương ứng cho từng phương thức truyền tin:| Decorator | HTTP Method | Ý nghĩa nghiệp vụ | Ví dụ Endpoint |
|---|---|---|---|
@Get() | GET | Đọc dữ liệu (Lấy danh sách hoặc chi tiết). | GET /products/12 |
@Post() | POST | Tạo mới dữ liệu. | POST /products |
@Patch() | PATCH | Cập nhật một phần dữ liệu đã tồn tại. | PATCH /products/12 |
@Put() | PUT | Thay thế toàn bộ thực thể dữ liệu cũ. | PUT /products/12 |
@Delete() | DELETE | Xóa tài nguyên khỏi hệ thống. | DELETE /products/12 |
3. Các Decorator Trích xuất Dữ liệu Request (Payload Extractors)
Khi Client gửi Request lên Server, dữ liệu có thể nằm ở nhiều vị trí khác nhau (Body, URL, Query, Headers). NestJS cung cấp các decorator chuyên biệt để trích xuất dữ liệu này một cách an toàn và gọn gàng trực tiếp trên tham số của hàm:- 1. @Body() (Dữ liệu gửi lên)
- 2. @Param() (Tham số đường dẫn)
- 3. @Query() (Tham số truy vấn)
- 4. @Headers() & Khác
Trích xuất phần Body của Request (chủ yếu dùng cho POST, PUT, PATCH). Dữ liệu sẽ tự động được ánh xạ vào kiểu DTO đã khai báo.
4. Kiểm soát kiểu dữ liệu bằng Pipes
Khi trích xuất tham số từ URL (@Param) hoặc Query (@Query), kiểu dữ liệu mặc định nhận về luôn là chuỗi ký tự (string). Để chuyển đổi và kiểm soát kiểu dữ liệu an toàn trước khi truyền vào Service, bạn nên sử dụng các Pipes tích hợp sẵn của NestJS:
ParseIntPipe: Chuyển đổi và xác thực tham số phải là số nguyên (Integer).ParseUUIDPipe: Xác thực chuỗi ký tự gửi lên có đúng chuẩn định dạng UUID hay không.