Šta su kontroleri?

Kontroleri u Nest.js su klasične TypeScript klase koje su dekorisane @Controller() dekoratorom. U ovakvim klasama se definišu metode koji odgovaraju HTTP operacijama kao što su GET, POST, PUT, DELETE, gde je svaki metod u okviru kontrolera dekorisan odgovarajućim HTTP dekoratorom.

Primer jednostavnog kontrolera:

U ovom primeru @Controller('users') dekorator definiše osnovnu rutu (“/users“) za sve metode unutar kontrolera. Ovaj kontroler iz primera ima tri metode za tri tipa zahteva, i sve tri metode su obeležene sa odgovajućim dekoratorima u zavisnosti od tipa HTTP zahteva koji obrađuju:

  • findAll(): Obradjuje GET zahtev na ruti /users i vraća listu svih korisnika.
  • findOne(): Obradjuje GET zahtev na ruti /users/:id i vraća korisnika sa zadatim ID-om.
  • create(): Obradjuje POST zahtev na ruti /users i kreira novog korisnika.

nest.js

Kreiranje kontrolera

Da biste dodali kontroler u modul, najlakše je koristiti sledeće komande u terminalu:

Ova komanda će generisati users.controller.ts fajl u okviru novog foldera “users” i njega će smestiti u root projekta tj. src/users:

NAPOMENA:
Ako ne postoji direktorijum pod nazivom “users” ova komanda će i njega napraviti. Ukoliko ipak ne želimo da napravimo folder pod nazivom kontrolera već samo kontroler fajl, onda koristimo flag --flat.

Prethodna naredba će napraviti u root direktorijumu (“src”) samo fajl vezan za kontroler nekiKontroler.controller.ts, takodje postoji način da kreiramo novi kontroler fajl u već postojeći folder, a za to koristimo sledeću sintaksu:

Sa ovom naredbom će biti kreiran fajl “noviKontroler.controller.ts” u okviru foldera pod nazivom “nekiFolder”.

Naredba će pored toga će istovremeno dodati taj kontroler i u modul u okviru liste svih kontrolera:

Dekoratori za pristup podacima request-a

Pored dekoratora za obeležavanje tipa request-a (@Get(), @Post()…), postoje i dekoratori za lakši pristup podacima zahteva. Ovi dekoratori olakšavaju rad sa različitim delovima HTTP zahteva i omogućavaju jednostavno i čitljivo rukovanje zahtevima unutar kontrolera:

  • @Param('id'): Omogućava pristup parametru id iz URL-a
  • @Body(): Omogućava pristup telu POST zahteva.
  • @Headers() omogućava pristup HTTP zaglavljima.
  • @Ip() omogućava pristup IP adresi klijenta.
  • @Body() omogućava pristup telu POST zahteva.
  • @Session() omogućava pristup sesijskim podacima.
  • @Cookies() omogućava pristup kolačićima.
  • @HostParam('host') omogućava pristup parametrima hosta.
Primer

Evo kako možete koristiti neke od ovih dekoratora u kontroleru:

U prethodnom primeru dekorator @Get označava da će metoda findOne() odgovoriti na zahtev. Dekorator @Param(‘id’) izvlači parametar pod imenom “id” iz URL-a zahteva, dok dekorator @Query() izvlači sve query parametre iz URL-a zahteva i čuva ih u objektu “query” (npr. za URL /users/123?search=test, query će biti { search: ‘test’ }). Dekorator @Ip() obezbedjuje IP adresu klijenta koji je poslao zahtev.

Dostupnost servisa u kontrolerima

Servisi se koriste za enkapsulaciju poslovne logike i omogućavaju ponovnu upotrebu koda. Servisi se mogu lako uvesti u kontrolere korišćenjem mehanizma za injekciju zavisnosti (dependency injection) koji pruža Nest.js. U Nest.js postoji nekoliko načina za injekciju servisa u kontroler.

Injectovanje servisa kroz konstruktor

Najčešći način je putem konstruktora, kao što je prikazano u sledećem primeru:

U ovom primeru, UsersController koristi UsersService za obradu zahteva. Servis se ubacuje u kontroler kroz konstruktor.

Injektovanje servisa kroz svojstvo

Iako nije toliko često korišćena, moguća je i injekcija servisa putem svojstava koristeći dekorator @Inject.

NAPOMENA:
Takodje postoji i “Manuelna injekcija” servisa ali je prilično komplikovana a koristi se samo u specifičnim slučajevima kada ne možete koristiti konstruktorsku ili property-based injekciju. Ovaj pristup koristi ModuleRef, koji omogućava pristup Nest.js Dependency Injection (DI) kontejneru za ručno dobijanje instanci servisa.

Podelite:

Ostavite komentar