mirror of
https://github.com/jackyzha0/quartz.git
synced 2025-12-24 13:24:05 -06:00
137 lines
4.0 KiB
Markdown
137 lines
4.0 KiB
Markdown
## 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[];
|
|
}
|
|
```
|