Uvodu u Nest.js “Pipe”
Pipes u NestJS-u su specijalne komponente koje se koriste za transformaciju i validaciju podataka pre nego što stignu do kontrolera ili metoda kontrolera. Pipes su korisni kada želimo da osiguramo da podaci koje primamo u API zahtevima ispunjavaju određene uslove ili da se na specifičan način transformišu.
Nest.js dolazi sa ugrađenim pipes koji se mogu koristiti za transformaciju i validaciju podataka. Ugrađeni pipe-ovi, pružaju brza i efikasna rešenja za osnovne zadatke kao što su validacija i transformacija. Evo nekih ugrađeni pipes:
- ValidationPipe: Automatska validacija podataka koristeći dekoratore.
- ParseIntPipe: Automatska konverzija stringa u broj.
- ParseBoolPipe: Automatska konverzija stringa u boolean.
- ParseArrayPipe: Automatska konverzija stringa u niz.
- ParseUUIDPipe: Automatska validacija UUID formata.
- DefaultValuePipe: Postavljanje podrazumevane vrednosti ako vrednost nije definisana.
Međutim, ako su vaši zahtevi specifični, možete kreirati “custom pipe-ove” koristeći interfejs “PipeTransform”.
ValidationPipe
Ako se “ValidationPipe” koriste za DTO validaciju onda je potrebno da instaliramo dodatne biblioteke (kod drugih ugrađenih pipe-ove to nije potrebno). Ovo su dve neophodne biblioteke:
- class-validator: Omogućava definisanje i proveru pravila validacije.
- class-transformer: Transformiše ulazne podatke u instance klasa DTO-a.
Koristite sledeću komandu za instalaciju:
Šta je “class-transformer”?
“class-transformer” je TypeScript biblioteka koja omogućava pretvaranje (transformaciju) plain JavaScript objekata u instance klasa i obrnuto. Obično su to jednostavni JavaScript objekti (dobijeni, na primer, iz JSON-a) u instance definisanih klasa. Takođe omogućava dodavanje logike za prilagođene transformacije i rad sa ugneždenim strukturama objekata.
Primer: JS objekt u instancu klase
Primer: klasa u plain JS objekat
Šta je “class-validator”?
“class-validator” je TypeScript biblioteka koja omogućava definisanje i proveru pravila validacije za JavaScript objekte. Ova biblioteka koristi dekoratore za definisanje pravila validacije, kao što su provera tipova, dužine, minimalne i maksimalne vrednosti, obavezna polja, regularni izrazi i mnoga druga pravila.
Ovo su najčešće korišćeni:
- @IsString(): Proverava da li je vrednost string.
- @IsInt(): Proverava da li je vrednost integer.
- @IsBoolean(): Proverava da li je vrednost boolean.
- @IsEmail(): Proverava da li je vrednost validna email adresa.
- @IsNotEmpty(): Proverava da li je vrednost prazna.
- @MinLength(): Proverava minimalnu dužinu stringa.
- @MaxLength(): Proverava maksimalnu dužinu stringa.
- @Min(): Proverava minimalnu vrednost broja.
- @Max(): Proverava maksimalnu vrednost broja.
- @Matches(): Proverava da li vrednost odgovara regularnom izrazu.
Listu svih dekoratora možete pronaći na ovome linku.
Primer
ValidationPipe opcije
Validation Pipe u NestJS-u ima nekoliko korisnih opcija za prilagođavanje ponašanja prilikom validacije. Ove opcije omogućavaju detaljniju kontrolu nad načinom na koji će validacija biti izvršena i pomažu pri rukovanju sa nepotrebnim ili nevalidnim podacima. U nastavku su objašnjene glavne opcije koje možete koristiti sa Validation Pipe-om.
a) Opcija whitelist
Opcija whitelist služi za automatsko uklanjanje svih svojstava koja nisu definisana u DTO (Data Transfer Object) klasi. Kada je ova opcija omogućena, svi dodatni podaci koji nisu eksplicitno definisani u DTO klasi biće ignorisani, čime se osigurava da samo željena svojstva budu obrađena.
Primer:
b) Opcija forbidNonWhitelisted
Opcija forbidNonWhitelisted radi u kombinaciji sa whitelist. Kada je omogućena, ova opcija baca grešku svaki put kada se pojavi neko polje koje nije definisano u DTO klasi, umesto da ga samo ignoriše. Ovo je korisno ako želite striktno kontrolisati podatke i sprečiti prolazak bilo kakvih dodatnih informacija koje ne pripadaju zahtevanoj strukturi.
Primer:
c) Opcija transform
Opcija transform omogućava automatsko prebacivanje ulaznih podataka u instance DTO klasa. Kada je omogućena, ulazni podaci će se automatski transformisati u instancu DTO klase, što omogućava lakši pristup metodama i tipovima u okviru objekta.
Primer:
ValidatePipe na nivou parametra
ValidationPipe
se može primeniti na pojedinačni parametar rute za validaciju ulaznih podataka.
Ako korisnik pošalje zahtev sa nevalidnim id (npr. nije UUID), API vraća grešku:
ValidatePipe na nivou metode
Dekorator @UsePipes se koristi da primeni ValidationPipe na nivou metode kontrolera.
Validan zahtev:
Nevalidan zahtev:
API odgovara sa greškom:
ValidatePipe na nivou klase
Dekorator @UsePipes može se primeniti na klasu kontrolera, čime se ValidationPipe primenjuje na sve metode u okviru te klase.
Prednost: Svi zahtevi u okviru kontrolera automatski prolaze validaciju, što smanjuje potrebu za pojedinačnim deklarisanjem.
ValidatePipe na globalnom nivou
ValidationPipe se može registrovati kao globalni Pipe, čime se primenjuje na sve rute u aplikaciji.
Opcije za ValidationPipe:
- whitelist: true – Automatski uklanja svojstva koja nisu definisana u DTO klasi.
- forbidNonWhitelisted: true – Baca grešku ako se pojave nepoznata svojstva.
- transform: true – Transformiše ulazne podatke u instance DTO klasa.
Prednost: Validacija se primenjuje automatski na sve zahteve, bez potrebe za deklarisanjem u svakom kontroleru.
Custom pipes
Ako su vaši zahtevi specifični, onda je nepohodno kreirati “custom pipe-ove”. Za kreiranje pipes, je potrebno:
- Kreirate novu klasu koja implementira PipeTransform interfejs.
- Implementirate metodu transform(), koja prima dva parametra:
- value: Ulazna vrednost koja dolazi iz zahteva.
- metadata: Informacije o vrednosti (opciono, sadrži podatke o tipu i dekoratorima).
Primer 1: Pipe za validaciju broja
Kreiramo Pipe koji proverava da li je ulazni string validan broj. Ako nije, baca grešku.
Korišćenje u kontroleru:
Ako klijent pošalje zahtev na /users/123, vrednost 123 se uspešno konvertuje u broj.
Ako pošalje /users/abc, API baca grešku:
Primer 2: Pipe za dozvoljene vrednosti
Pipe proverava da li je vrednost iz liste dozvoljenih vrednosti.
Korišćenje u kontroleru:
Validan zahtev: /products?type=electronics
Nevalidan zahtev: /products?type=clothing
Primer 3: Pipe za transformaciju u veliki tekst
Pipe transformiše string u uppercase.
Korišćenje u kontroleru:
Ulaz: {“text”: “hello world”}
Izlaz: Message: HELLO WORLD