Class 03: Service và Data Validation
Tách business logic vào Service
Mục tiêu
Trong NestJS, Service là nơi xử lý business logic — logic nghiệp vụ, không nên để trong Controller. Điều này giúp code dễ bảo trì, kiểm thử và mở rộng.
Tạo Service
NestJS cho phép bạn tạo service bằng CLI:
nest generate service usersSử dụng Service trong Controller
Giả sử bạn có một service UsersService chứa logic xử lý:
// users.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
@Injectable()
export class UsersService {
private users = [];
create(user: CreateUserDto) {
this.users.push(user);
return user;
}
findAll() {
return this.users;
}
}Inject service vào controller:
Giới thiệu class-validator và class-transformer
class-validator và class-transformerCài đặt
Mục đích
class-validator: giúp xác thực dữ liệu đầu vào (validate)class-transformer: chuyển đổi dữ liệu (transform) – ví dụ, từ JSON sang class instance
Ví dụ DTO với validate
Áp dụng Pipe để validate đầu vào
NestJS sử dụng Pipe để xử lý dữ liệu trước khi vào controller — có thể dùng để validate dữ liệu với DTO.
Sử dụng pipe ValidationPipe toàn cục
ValidationPipe toàn cụcMở main.ts:
Hoặc chỉ dùng cho 1 route:
Các tùy chọn hữu ích của ValidationPipe
ValidationPipeThực hành: Validate dữ liệu người dùng với DTO + Pipe
Bước 1: Tạo DTO
Bước 2: Cập nhật service
Bước 3: Cập nhật controller
Bước 4: Kiểm tra bằng Postman hoặc curl
Gửi POST /users với body:
Bài tập thực hành
Bài 1: Bổ sung trường age vào DTO
age vào DTOThêm field
agekiểu sốDùng
@IsInt()và@Min(18)để đảm bảo người dùng từ 18 tuổi trở lên
Bài 2: Tạo DTO mới để cập nhật người dùng (UpdateUserDto)
UpdateUserDto)Sử dụng
PartialTypetừ@nestjs/mapped-typesđể kế thừa từCreateUserDto
Bài 3: Xử lý lỗi trả về dưới dạng JSON thân thiện
Sử dụng pipe ValidationPipe có cấu hình:
Kết luận
Sau bài học này, bạn đã nắm được:
Cách tách logic nghiệp vụ vào
ServiceCách dùng
class-validator,class-transformerđể kiểm tra dữ liệu đầu vàoCách cấu hình và sử dụng
ValidationPipeđể kiểm tra dữ liệu quaDTO
Last updated