Kiểm soát dữ liệu đầu vào bằng DTO & Validation
Trong phát triển Backend, việc kiểm soát và xác thực dữ liệu do người dùng gửi lên (qua HTTP Request Body, Query hoặc Params) là bước tối quan trọng để bảo vệ hệ thống khỏi lỗi logic và các lỗ hổng bảo mật. Trong NestJS, việc này được thực hiện thông qua DTO (Data Transfer Object) kết hợp với bộ thư viện tự động validate. Tài liệu này hướng dẫn cách thiết lập DTO và cách sử dụng Claude Code để tự động hóa quy trình này.1. DTO là gì?
DTO (Data Transfer Object - Đối tượng truyền dữ liệu) là một lớp (Class) xác định cấu trúc dữ liệu được gửi qua mạng.Tại sao nên dùng DTO?
- Xác thực dữ liệu (Validation): Đảm bảo dữ liệu gửi lên đúng định dạng (ví dụ: email phải đúng định dạng, tuổi phải là số dương).
- Lọc dữ liệu thừa (Sanitization): Loại bỏ các trường dữ liệu lạ không được khai báo trong DTO (tránh lỗ hổng Mass Assignment - tin tặc tự ý gửi thêm trường
role: 'admin'để chiếm quyền). - Đồng nhất kiểu dữ liệu: Giúp mã nguồn có kiểu dữ liệu rõ ràng (Type safety) cho TypeScript.
2. Thiết lập cơ chế Validate tự động
Để tự động hóa việc xác thực, chúng ta cần cài đặt hai thư viện bổ sung và kích hoạtValidationPipe toàn cục trong tệp khởi động main.ts.
Cài đặt thư viện:
Kích hoạt ValidationPipe toàn cục:
Yêu cầu Claude Code sửa filesrc/main.ts để bật chế độ lọc và chặn dữ liệu thừa:
src/main.ts
3. Cách viết DTO với các Decorator phổ biến
Dưới đây là mộtCreateUserDto chứa đầy đủ các quy tắc xác thực thông dụng:
src/users/dto/create-user.dto.ts
Tạo DTO cập nhật (Update DTO) cực nhanh:
Thay vì viết lại toàn bộ các trường, bạn sử dụngPartialType để kế thừa và biến tất cả các trường thành tùy chọn (optional):
src/users/dto/update-user.dto.ts
4. Cách phối hợp viết DTO với Claude Code
Đối với người học không chuyên, việc nhớ các decorator kiểm tra dữ liệu củaclass-validator có thể khá phức tạp. Hãy để Claude Code xử lý việc này bằng các prompt mô tả nghiệp vụ của bạn: