Kurs NestJS · Moduł 10: Walidacja danych
class-validator - Dekoratory strażników bramy
W tej lekcji4
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.
Instalacja
1npm install class-validator class-transformerPodstawowe dekoratory
@IsString() - strażnik tekstu
Sprawdza, 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}@IsNumber() - strażnik liczb
Weryfikuje, czy wartość jest liczbą:
1import { IsNumber } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsNumber()
5 age: number; // 25, "dwadzieścia pięć"
6}@IsEmail() - strażnik wiadomości
Sprawdza poprawność formatu adresu email:
1import { IsEmail } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsEmail()
5 cursusPublicus: string; // "marcus@roma.com", "marcus"
6}@IsNotEmpty() - strażnik pustych pól
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}@MinLength() i @MaxLength() - strażnicy długości
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}Łączenie dekoratorów
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}Własne komunikaty błędów
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!
Kod do tej lekcji: src/basic-decorators.ts
1// class-validator - Podstawowe dekoratory strażników
2import {
3 IsString,
4 IsNotEmpty,
5 IsNumber,
6 IsEmail,
7 MinLength,
8 MaxLength,
9 Min,
10 Max,
11} from 'class-validator';
12
13// DTO rekrutacyjny legionisty
14export class CreateLegionaryDto {
15 @IsString({ message: 'Imię musi być tekstem!' })
16 @IsNotEmpty({ message: 'Imię nie może być puste!' })
17 @MinLength(2, { message: 'Imię musi mieć min. 2 znaki!' })
18 @MaxLength(50)
19 name: string;
20
21 @IsString()
22 @IsNotEmpty()
23 rank: string;
24
25 @IsNumber({}, { message: 'Wiek musi być liczbą!' })
26 @Min(16, { message: 'Minimum 16 lat do legionu!' })
27 @Max(65)
28 age: number;
29
30 @IsEmail({}, { message: 'Niepoprawny email!' })
31 cursusPublicus: string;
32}
33
34// TODO: Stwórz klasę CreateTributeDto z polami:
35// - provinceName: string (wymagany, min 3 znaki)
36// - amount: number (min 1, max 10000)
37// - collectorEmail: string (musi być emailem)
38// - description: string (opcjonalny, max 200 znaków)
39
40export class CreateTributeDto {
41 // Dodaj dekoratory walidacji tutaj
42}
43
44console.log('Dekoratory class-validator gotowe!');
45Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Co robi dekorator @IsString() z biblioteki class-validator?
2. Jaki jest efekt użycia dekoratora @IsNotEmpty()?
To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Edytor kodu
Uzupełnij brakujące dekoratory walidacji w klasie CreateMessengerDto
- Układanie w pionie
Ułóż dekoratory walidacji pola 'name' od najogólniejszego do najbardziej szczegółowego:
- Edytor kodu
Uzupełnij dekoratory własnymi komunikatami błędów w CreateTaxCollectorDto
- Klikanie w kolejności
Ułóż kroki instalacji i konfiguracji walidacji w NestJS: