Kurs NestJS · Moduł 10: Walidacja danych

class-validator - Dekoratory strażników bramy

2 min czytania
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-transformer

Podstawowe 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!');
45

Widzisz błąd w tej lekcji?

Sprawdź się

Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.

  1. 1. Co robi dekorator @IsString() z biblioteki class-validator?

  2. 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:

Przydatne artykuły