Wprowadzenie do NestJS. Twórz wydajne aplikacje
Ostatnia aktualizacja 6 listopada, 2023
NestJS to nowoczesny framework dla aplikacji serwerowych Node.js. Wykorzystuje TypeScript oraz nowoczesne elementy JavaScriptu. Jego elastyczność oraz modułowość sprawiają, że doskonale nadaje się do budowy efektywnych, skalowalnych aplikacji mikroserwisowych, jak również tradycyjnych aplikacji monolitycznych. Zapewnia on szereg gotowych do użycia mechanizmów związanych z tworzeniem API, obsługą błędów, a także integracją z bazami danych.
Architektura NestJS
NestJS wykorzystuje architekturę modułową, która ułatwia organizację kodu i jego ponowne użycie. Serce każdej aplikacji opartej na tym frameworku to moduły, kontrolery oraz serwisy.
W poniższym fragmencie kodu definiujemy moduł UsersModule
, który agreguje kontrolery oraz serwisy związane z użytkownikami. Kontroler zajmuje się obsługą żądań HTTP, natomiast serwis zawiera logikę biznesową.
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
Cały proces zaczyna się od importowania niezbędnych elementów:
Module
to dekorator pochodzący z pakietu@nestjs/common
, który jest używany do oznaczenia klasy jako moduł w NestJS.UsersController
to klasa kontrolera, która została zdefiniowana w plikuusers.controller.ts
.UsersService
to klasa serwisu, która została zdefiniowana w plikuusers.service.ts
.
Dekorator @Module({})
jest najważniejszym elementem, który określa metadane modułu:
controllers: [UsersController]
określa, że w ramach danego modułu używany będzieUsersController
. Kontroler ten będzie obsługiwał przychodzące żądania HTTP związane z użytkownikami, takie jak pobieranie danych użytkowników, ich aktualizacja czy usuwanie.providers: [UsersService]
informuje NestJS, że w modułach będą dostępne pewne usługi – w tym przypadkuUsersService
. To właśnie serwis zawiera logikę biznesową aplikacji, a moduł dzięki temu zapisowi wie, że powinien go utworzyć i umożliwić wstrzyknięcie jako zależność tam, gdzie będzie to potrzebne.
Na koniec za pomocą export class UsersModule {}
eksportowana jest klasa UsersModule
, dzięki czemu może być wykorzystana w innych częściach aplikacji. Szczególnie podczas kompozycji głównego modułu aplikacji, który agreguje wszystkie moduły w systemie.
Kontrolery w NestJS
Kontroler w NestJS odpowiada za obsługę przychodzących żądań i zwracanie odpowiedzi. Jest to klasa z dekoratorami, które definiują trasy oraz typy żądań.
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll();
}
}
W tym przykładzie kontroler UsersController
ma jedną ścieżkę /users
, która reaguje na żądania typu GET. Metoda findAll
korzysta z serwisu UsersService
, aby pobrać i zwrócić dane wszystkich użytkowników.
Na początku importujemy niezbędne elementy:
Controller
orazGet
to dekoratory z pakietu@nestjs/common
. DekoratorController
jest używany do oznaczania klasy jako kontrolera, który obsługuje żądania HTTP.Get
to dekorator metody, który wskazuje, że dana metoda będzie obsługiwała żądania HTTP GET.
Następnie:
UsersService
jest serwisem, który został zaimportowany z plikuusers.service.ts
i będzie wykorzystywany do wykonania operacji związanych z użytkownikami, jak na przykład pobieranie danych użytkowników.
Dekorator @Controller('users')
ma zastosowanie w klasie UsersController
i ustawia podstawową ścieżkę dla wszystkich metod w tym kontrolerze. W tym przypadku wszystkie metody kontrolera UsersController
będą dostępne pod ścieżką /users
.
Wewnątrz klasy UsersController
znajduje się konstruktor, który tworzy prywatne pole usersService
. Dzięki zastosowaniu mechanizmu iniekcji zależności (private usersService: UsersService
), instancja UsersService
wstrzykuje się automatycznie przez NestJS. Pozwala to na używanie metod tego serwisu wewnątrz kontrolera.
Metoda findAll
:
- Jest ozdobiona dekoratorem
@Get()
, który wskazuje, że ta metoda będzie obsługiwała żądania GET wysłane na ścieżkę/users
. Ponieważ nie określiliśmy żadnej dodatkowej ścieżki w dekoratorze@Get
, przyjmuje ona domyślnie ścieżkę podstawową kontrolera. - Wewnątrz metody
findAll
, wywołujemy metodęfindAll
z serwisuusersService
, który powinien zwrócić listę wszystkich użytkowników.
Dalsza część tekstu znajduje się pod materiałem wideo:
Serwisy
Serwisy są miejscem, gdzie umieszcza się logikę biznesową aplikacji. NestJS promuje zasadę oddzielenia logiki biznesowej od logiki transportu. Umożliwia to lepszą organizację kodu i ułatwia testowanie.
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private readonly users = [];
findAll() {
return this.users;
}
}
W tej części kodu mamy serwis UsersService
, który zawiera metodę findAll
zwracającą listę użytkowników. Serwis łatwo wstrzykuje się do kontrolera za pomocą mechanizmu Dependency Injection. W dalszych krokach można go użyć do wykonania bardziej złożonych operacji związanych z użytkownikami.
- Importowany jest dekorator
Injectable
z pakietu@nestjs/common
. Dekorator ten oznacza, że klasą może zarządzać system kontroli zależności NestJS. Oznacza to, że Nest będzie wiedział, jak tworzyć i zarządzać instancjami tej klasy oraz jak je wstrzykiwać do innych części aplikacji, takich jak kontrolery. - Deklaracja
@Injectable()
bezpośrednio nad klasąUsersService
sygnalizuje, że ta klasa jest serwisem, czyli może być wstrzyknięta jako zależność w innych klasach. - Klasa
UsersService
zawiera jedną właściwość:users
, która jest prywatną tablicą, zapewne przeznaczoną do przechowywania danych o użytkownikach. Użycieprivate readonly
wskazuje, że ta tablica nie może być modyfikowana z zewnątrz klasy, areadonly
sugeruje, że nie można zmieniać referencji tej tablicy po zainicjalizowaniu. - W klasie znajduje się metoda
findAll()
, która ma za zadanie zwrócić zawartość tablicyusers
. Ponieważ nie ma tu żadnego mechanizmu persystencji, jak baza danych, zwraca się po prostu pusta tablica, którą zainicjowano w momencie tworzenia instancji serwisu.
Czytaj także: