Teraz, gdy wiesz czym jest walidacja, czas poznać class-validator — bibliotekę dekoratorów, która zamienia zwykłe klasy DTO w prawdziwe posterunki strażnicze. Każdy dekorator to jak osobny strażnik specjalizujący się w konkretnym sprawdzeniu.
1npm install class-validator class-transformerSprawdza, czy wartość jest łańcuchem znaków. To jak strażnik weryfikujący, czy dokument jest napisany na papyrusie, a nie na kamieniu:
1import { IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsString()
5 name: string; // "Marcus" ✅, 12345 ❌
6}Weryfikuje, czy wartość jest liczbą:
1import { IsNumber } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsNumber()
5 age: number; // 25 ✅, "dwadzieścia pięć" ❌
6}Sprawdza poprawność formatu adresu email:
1import { IsEmail } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsEmail()
5 cursusPublicus: string; // "marcus@roma.com" ✅, "marcus" ❌
6}Nie przepuści pustych wartości — każde pole musi mieć treść:
1import { IsNotEmpty, IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsString()
5 @IsNotEmpty()
6 name: string; // "Marcus" ✅, "" ❌, null ❌
7}Kontrolują minimalną i maksymalną długość tekstu:
1import { MinLength, MaxLength, IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsString()
5 @MinLength(2)
6 @MaxLength(50)
7 name: string; // "Marcus" ✅, "M" ❌, "A".repeat(51) ❌
8}Prawdziwa siła class-validator tkwi w łączeniu wielu dekoratorów na jednym polu. To jak kilku strażników sprawdzających różne aspekty jednego dokumentu:
1import {
2 IsString,
3 IsNotEmpty,
4 MinLength,
5 MaxLength,
6 IsNumber,
7 IsEmail,
8 Min,
9 Max,
10} from 'class-validator';
11
12export class CreateLegionaryDto {
13 @IsString()
14 @IsNotEmpty()
15 @MinLength(2)
16 @MaxLength(50)
17 name: string;
18
19 @IsString()
20 @IsNotEmpty()
21 rank: string;
22
23 @IsNumber()
24 @Min(16)
25 @Max(65)
26 age: number;
27
28 @IsEmail()
29 cursusPublicus: string;
30
31 @IsString()
32 @IsNotEmpty()
33 legio: string;
34}Każdy dekorator przyjmuje opcjonalny parametr z komunikatem błędu — żeby strażnik umiał wytłumaczyć, co jest nie tak:
1export class CreateLegionaryDto {
2 @IsString({ message: 'Imię musi być tekstem, legioniście!' })
3 @IsNotEmpty({ message: 'Imię nie może być puste!' })
4 @MinLength(2, { message: 'Imię musi mieć co najmniej 2 znaki!' })
5 name: string;
6
7 @IsNumber({}, { message: 'Wiek musi być liczbą!' })
8 @Min(16, { message: 'Musisz mieć co najmniej 16 lat, by wstąpić do legionu!' })
9 age: number;
10}Dzięki class-validator tworzysz silną straż, która automatycznie odrzuca niepoprawne dane jeszcze zanim dotrą do logiki biznesowej. W następnej lekcji poznasz zaawansowane dekoratory!