4.0 KiB
Instalacja
- Zainstalowanie CLI:
npm i -g @nestjs/cli - Utworzenie nowego projektu
nest new [nazwa]
Struktura projektu
Podstawową struktury kodu w NestJS są klasy (eng. classes) oraz dekoratory (eng. decorators).
Controllers
Controllery to klasy, których zadaniem jest obsługa akcji poszczególnych ścieżek (routing) aplikacji. Przykładowo jeżeli użytkownik wejdzie na adres https://brain.overment.com to na pewnym etapie akcja controllera pobierze niezbędne dane i zwróci odpowiedź.
W NestJS controller można powiązać ze ścieżką, wykorzystując parametry przekazane do dekoratora Controllera oraz jego Akcji.
Powiązanie controllera ze ścieżką '/users':
@Controller('users')
export class UsersController {}
Powiązanie akcji controllera ze ścieżką /users/:id. Dodatkowo ta akcja przyjmuje również parametr id.
export class UsersController {
**@Get('id')**
find(@Param('id') id: number) {
return `User: ${id}`;
}
}
Akcje kontrolera mogą przyjmować również request body.
export class UsersController {
@Post()
find(@Body() body) {
return `User: ${body.id}`;
}
}
Akcje mogą przyjmować też parametry query string
export class UsersController {
@Get()
find(@Query() query) {
return `User: ${query.id}`;
}
}
Akcje mogą zwracać kod statusu
export class UsersController {
@Post()
@HttpCode(HttpStatus.OK)
find(@Body() body) {}
}
Tworzenie controllerów
Z pomocą CLI: nest g co (lub nest generate controller) tworzymy plik controllera i spec.ts.
- flaga --no-spec umożliwia utworzenie controllera bez pliku spec.ts
- podając w nazwie katalog, umieścisz go w podkatalogu
- flaga --dry-run umożliwia przetestowanie polecenia
Services
Serwisy umożliwiają rozdzielenie logiki naszej aplikacji na mniejsze części, ułatwiając jej organizację.
Przykład serwisu:
@Injectable()
export class UsersService {}
Dodawanie serwisu np. do controllera odbywa się w konstruktorze:
@Controller()
export class UsersController {
constructor(private readonly usersService: UsersService)
// private declares and initializes field
}
Tworzenie serwisów
Z pomocą CLI nest g s (lub nest generate service) tworzymy plik serwisu i spec.ts
Serwis to zwykła klasa z dektoratorem @Injectable()
W Nest.js każdy serwis to Provider. Oznacza to, że serwisy mogą przyjmować zależności np. w postaci innych serwisów.
Modules
W NestJS moduły pozwalają na organizowanie logiki biznesowej powiązanych ze sobą fragmentów (np. AuthModule)
Dekorator @Module przyjmuje obiekt zawierający informację o:
- controllerach (z których korzysta dany moduł)
- exportowanych providerach, które mają być dostępne tam, gdzie importowany jest moduł
- importowanych modułach
- wykorzystywanych providerach, które będą dostępne tylko w tym module
Tworzenie modułów
Z pomocą CLI nest g module tworzymy nowy moduł aplikacji oraz aktualizujemy główny moduł aplikacji (src/app.module.ts)
Data Transfer Objects
DTO pozwalają na określenie interfejsów dla danych wejściowych i wyjściowych w aplikacji. Np. z ich pomocą możemy określić kształt wymaganego obiektu.
DTO to proste obiekty, których rolą jest po prostu określenie struktury danych. Nie zawierają żadnej logiki biznesowej ani czegokolwiek, co wymaga testowania.
Przykład:
export class CreateUserDto {
name: string;
brand: string;
flavors: string[];
}
Tworzenie DTO
Z pomocą CLI nest g class users/dto/create-user.dto --no-specgenerujemy plik create-user.dto.ts eksportujący klasę CreateUserDto
Validation
- W pliku main.ts dodaj globalPipe: app.useGlobalPipes(new ValidationPipe())
- Zainstaluj class-validator class-transformer
import { IsString } from 'class-validator'
export class CreateUserDto {
@IsString()
readonly name: string;
@IsString({ roles })
readonly roles: string[];
}