Основні частини застосунку
Застосунок NestJS складається з чотирьох основних частин, які разом утворюють архітектурний каркас фреймворка. Кожна з них виконує свою роль у побудові логічно ізольованих, але взаємопов'язаних шарів.
1. Модулі (Modules)
Модуль - це контейнер, який групує пов'язані елементи застосунку: контролери, сервіси, фільтри, пайпи тощо.
Кожен застосунок NestJS завжди має щонайменше один модуль - AppModule (кореневий).
Приклад:
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
import { AuthModule } from './auth/auth.module';
@Module({
imports: [UsersModule, AuthModule],
})
export class AppModule {}Роль:
- визначає межі функціональності;
- інкапсулює залежності;
- забезпечує масштабованість (можна додавати нові модулі без переписування старих).
2. Контролери (Controllers)
Контролери приймають вхідні запити (наприклад, HTTP-запити) і повертають відповіді клієнту. Вони визначають роути (ендпоінти) і передають виконання на сервіси.
Приклад:
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll();
}
}Роль:
- точка входу запитів (HTTP, WebSocket, GraphQL та ін.);
- не містить бізнес-логіки - лише маршрутизацію й передачу даних у сервіси.
3. Провайдери (Providers)
Провайдер - це будь-яка сутність, яку можна впровадити через Dependency Injection. Найчастіший приклад - сервіс, де зберігається бізнес-логіка.
Приклад:
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private users = [{ id: 1, name: 'Alex' }];
findAll() {
return this.users;
}
}Роль:
- реалізують бізнес-логіку;
- надають дані й функціонал іншим класам;
- керуються DI-контейнером NestJS.
4. Декоратори (Decorators)
Декоратори - це ключова особливість NestJS, яка дозволяє писати декларативний і читабельний код. Вони додають метадані, щоб Nest розумів, як обробляти клас чи метод.
Приклади декораторів:
| Декоратор | Призначення |
|---|---|
@Module() | описує модуль |
@Controller() | визначає контролер |
@Injectable() | позначає клас як провайдер |
@Get(), @Post(), @Put() | задають HTTP-маршрути |
@Body(), @Param(), @Query() | витягують дані із запиту |
@UseGuards(), @UseInterceptors() | підключають middleware-подібні механізми |
Роль:
- спрощують архітектуру, роблячи код декларативним і самодокументованим.
Взаємозв'язок компонентів
[ Клієнт ]
↓
[ Контролер ] → отримує запит
↓
[ Сервіс / Провайдер ] → обробляє дані й бізнес-логіку
↓
[ Модуль ] → керує залежностями й збіркою компонентів
↓
[ Відповідь клієнту ]Додаткові елементи NestJS (допоміжні рівні)
Хоча чотири основні частини - це фундамент, у реальних застосунках часто використовуються й інші важливі компоненти:
| Компонент | Опис |
|---|---|
| Pipes (пайпи) | Перетворюють і валідують вхідні дані |
| Guards (гварди) | Контролюють доступ (наприклад, авторизація) |
| Interceptors (інтерсептори) | Перехоплюють запити/відповіді, додають логіку |
| Filters (фільтри) | Обробляють помилки |
| Middlewares | Працюють до маршрутизації (наприклад, логування) |
Підсумкова структура типового застосунку
src/
├── app.module.ts
├── users/
│ ├── users.module.ts
│ ├── users.controller.ts
│ └── users.service.ts
├── auth/
│ ├── auth.module.ts
│ ├── auth.controller.ts
│ └── auth.service.ts
└── main.ts ← точка входу (bootstrap застосунку)Підсумок
| Компонент | Призначення |
|---|---|
| Module | Групує й керує залежностями |
| Controller | Приймає запити й надсилає відповіді |
| Provider (Service) | Реалізує бізнес-логіку |
| Decorator | Визначає поведінку й структуру компонентів |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.