quartz/content/Wiedza/Programowanie/NestJS/Podstawy.md
Adam Gospodarczyk 26fd11cf4a Add title
2022-04-26 18:19:23 +02:00

141 lines
4.0 KiB
Markdown

---
title: Podstawy
---
## Instalacja
1. Zainstalowanie CLI: `npm i -g @nestjs/cli`
2. 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-spec`generujemy 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[];
}
```