Do bramy obozu przybywa posłaniec z żądaniem: GET /legion/5. Serwer je odebrał - ale kto ma je obsłużyć? Aplikacja ma kilkadziesiąt metod i żadna nie wie, że to właśnie do niej.
W legionie od rozdzielania rozkazów jest centurion. Stoi między posłańcem a żołnierzami: przyjmuje rozkaz, rozpoznaje, kogo dotyczy, przekazuje dalej i odsyła odpowiedź. Sam nie wykonuje pracy - on ją kieruje. W NestJS tym centurionem jest kontroler.
Kontroler to klasa z dekoratorem wskazującym, jakim odcinkiem tras się zajmuje:
1@Controller('legion')
2export class LegionController { }Kolejność jest zawsze ta sama:
, potem @Controller('legion')
, na końcu nazwa klasy z ciałem.export class
Argument
'legion' to prefiks trasy. Wszystkie metody tej klasy będą obsługiwać adresy zaczynające się od /legion - i nie musisz tego powtarzać przy każdej z nich. Kontroler bez argumentu, @Controller(), przejmuje trasy od korzenia.Wewnątrz kontrolera każda metoda dostaje dekorator mówiący, na jakie żądanie odpowiada:
1@Controller('tributes')
2export class TributesController {
3 @Get()
4 findAll() { }
5
6 @Post()
7 create() { }
8
9 @Put(':id')
10 update() { }
11
12 @Delete(':id')
13 remove() { }
14}Cztery dekoratory odpowiadają czterem czynnościom na zasobie.
pobiera, @Get()
tworzy nowy zasób, @Post()
aktualizuje istniejący, @Put()
usuwa.@Delete()
Rozróżnienie
@Post od @Put bywa mylące, więc zapamiętaj je po skutku powtórzenia: wysłanie tego samego @Post dwa razy utworzy dwa zasoby, a tego samego @Put - zostawi jeden, po prostu zapisany dwukrotnie.Argument dekoratora dokłada kawałek trasy.
@Put(':id') w kontrolerze z prefiksem tributes obsłuży adres /tributes/42. Dwukropek oznacza parametr - miejsce, w które wpada dowolna wartość.Skoro trasa może zawierać parametr, trzeba go jakoś odczytać. Dane przychodzą w żądaniu trzema drogami i każda ma swój dekorator:
1@Get(':id')
2findOne(@Param('id') id: string) { }
3
4@Get('search')
5search(@Query('province') province: string) { }
6
7@Post()
8create(@Body() dto: CreateTributeDto) { }
wyciąga wartość ze ścieżki adresu - to on odczyta @Param('id')
5 z /legion/5. @Query('province') bierze parametr zapytania, czyli to, co stoi po znaku zapytania: ?province=rome. @Body() sięga po ciało żądania, wysyłane przy @Post i @Put.Te trzy pokrywają wszystko, czego zwykle potrzebujesz. Uwaga na dwie nazwy, które brzmią prawdopodobnie:
w NestJS nie istnieje - do ścieżki służy @Path()
@Param. @Header() istnieje, ale robi coś innego: ustawia nagłówek odpowiedzi. Do czytania nagłówków żądania służy @Headers(), w liczbie mnogiej.Złóżmy to w całość. Kolejność elementów metody jest niezmienna:
1@Get()
2getAllLegionaries() {
3 return this.service.findAll();
4}Najpierw dekorator
@Get(), potem nazwa metody, dalej ciało w nawiasach klamrowych, a w nim return this.service.findAll().I tu widać, czym kontroler naprawdę jest. Ta metoda nie zawiera logiki - przyjmuje żądanie i przekazuje je serwisowi. Centurion nie kuje mieczy; wie, do którego kowala posłać.
To jest reguła, którą polecam trzymać od pierwszego dnia, @name: w kontrolerze nie ma zapytań do bazy, obliczeń ani reguł biznesowych. Gdy metoda kontrolera rośnie ponad kilka linii, to znak, że robi coś, co należy do serwisu. Zysk jest praktyczny - tę samą logikę wywołasz potem z zadania wsadowego albo konsumenta kolejki, gdzie żadnego HTTP nie ma.
Zwróć uwagę, że nie budujemy odpowiedzi ręcznie. Zwrócona wartość zostanie zamieniona na JSON, a kod odpowiedzi NestJS dobierze sam: 200 dla większości metod, 201 dla
@Post, bo coś powstało.Centurion stoi u bramy i wie, komu przekazać rozkaz:
@Controller('prefiks'), export class, nazwa klasy,@Controller to prefiks trasy wspólny dla wszystkich metod klasy,@Get() pobiera, @Post() tworzy nowy zasób, @Put() aktualizuje, @Delete() usuwa,@Post tworzy dwa zasoby, powtórzony @Put - jeden,@Put(':id') obsłuży /tributes/42,@Param('id') czyta ze ścieżki, @Query('nazwa') czyta parametr zapytania po znaku ?, @Body() czyta ciało żądania,@Path() nie istnieje; @Header() ustawia nagłówek odpowiedzi, a nagłówki żądania czyta @Headers(),return this.service.findAll(),@Post - 201.W następnej lekcji poznasz tego, komu centurion przekazuje rozkazy - serwisy, czyli miejsce, w którym mieszka prawdziwa logika. A na razie zapamiętaj: kontroler rozpoznaje żądanie i wskazuje wykonawcę - a każde dane, których potrzebuje, przychodzą jedną z trzech dróg: ścieżką, zapytaniem albo ciałem.