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 users

Sử 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-validatorclass-transformer

Cà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

Mở main.ts:

Hoặc chỉ dùng cho 1 route:

Các tùy chọn hữu ích của ValidationPipe


Thự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

  • Thêm field age kiểu số

  • Dùng @IsInt()@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)

  • Sử dụng PartialType từ @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 Service

  • Cách dùng class-validator, class-transformer để kiểm tra dữ liệu đầu vào

  • Cách cấu hình và sử dụng ValidationPipe để kiểm tra dữ liệu qua DTO

Last updated