Тема 7. Фреймворк NestJS. Контролери та маршрутизація

Основні команди NestJS CLI

Генерація компонентів, nest generate, скорочення команд

Основні команди NestJS CLI

🎯 Мета лекції

  • Опанувати роботу з інструментом командного рядка NestJS CLI (Command Line Interface)
  • Навчитися автоматично генерувати компоненти через команду nest generate
  • Вивчити скорочення команд для прискорення розробки
  • Засвоїти генерацію модулів, контролерів, сервісів та повних ресурсів
  • Практикувати використання опцій генерації (--no-spec, --flat, --dry-run)
  • Зрозуміти структуру шляхів для організації коду у вкладені модулі
  • Ознайомитися з командами запуску застосунку у різних режимах
  • Навчитися перевіряти структуру проєкту перед генерацією через dry-run

🔑 Ключові терміни

  • CLI (Command Line Interface): інтерфейс командного рядка для автоматизації задач
  • Code Generation (генерація коду): автоматичне створення файлів та шаблонів
  • Schematic: шаблон генерації, що визначає структуру та вміст файлів
  • Dry Run: симуляція виконання команди без реальних змін у файловій системі
  • Resource: повний набір компонентів для REST API (module, controller, service, DTO)
  • Flat Structure (плоска структура): розміщення файлів без створення вкладеної папки
  • Watch Mode (режим спостереження): автоматична перекомпіляція при зміні коду

Інтерфейс командного рядка NestJS CLI

NestJS CLI (Command Line Interface) — це потужний інструмент командного рядка, що суттєво прискорює розробку через автоматизацію рутинних задач: створення проєктів, генерацію компонентів, запуск серверу розробки та збірку застосунку для продакшн. CLI забезпечує консистентність (consistency) структури коду, дотримання найкращих практик та економію часу розробника.

Філософія інструменту

На відміну від ручного створення файлів, NestJS CLI використовує schematic-підхід (schematics) — попередньо визначені шаблони, що генерують код з правильною структурою, іменуванням та взаємозв'язками між компонентами:

Ручне створення (без CLI):

// ❌ Потрібно вручну створити 4+ файли
// users/users.controller.ts
// users/users.service.ts
// users/users.module.ts
// users/dto/create-user.dto.ts
// users/users.controller.spec.ts
// users/users.service.spec.ts

// Потім вручну імпортувати контролер у модуль
// Потім зареєструвати модуль у app.module.ts
// Ризик помилок у іменуванні та імпортах

Генерація через CLI:

# ✅ Одна команда створює всі файли та реєстрацію
nest generate resource users
Loading diagram...
graph TB
    subgraph "Без CLI (ручна робота)"
        M1["📝 Створити controller.ts"]
        M2["📝 Створити service.ts"]
        M3["📝 Створити module.ts"]
        M4["📝 Створити DTO"]
        M5["📝 Імпортувати залежності"]
        M6["📝 Зареєструвати у app.module"]
        M7["⏱️ 10-15 хвилин"]
        
        M1 --> M2 --> M3 --> M4 --> M5 --> M6 --> M7
        
        style M7 fill:#ef4444,stroke:#b91c1c,color:#ffffff
    end
    
    subgraph "З CLI (автоматизація)"
        C1["⚡ nest generate resource users"]
        C2["✅ Всі файли створені"]
        C3["✅ Імпорти налаштовані"]
        C4["✅ Реєстрація у модулі"]
        C5["⏱️ 30 секунд"]
        
        C1 --> C2
        C2 --> C3
        C3 --> C4
        C4 --> C5
        
        style C5 fill:#22c55e,stroke:#15803d,color:#ffffff
    end

Встановлення та перевірка CLI

NestJS CLI встановлюється глобально через npm:

npm install -g @nestjs/cli

Перевірка встановлення:

nest --version
$ nest --version
10.4.7
$ nest --help
Usage: nest <command> [options]
Commands:
new Generate Nest application
generate Generate a Nest element
build Build Nest application
start Run Nest application
info Display Nest project details
Якщо команда nest не знайдена після встановлення, переконайтеся, що шлях до глобальних пакетів npm додано до змінної оточення PATH. У macOS/Linux перевірте ~/.bashrc або ~/.zshrc, у Windows — налаштування системних змінних.

Команда nest generate

nest generate (скорочення: nest g) — основна команда для створення компонентів застосунку. Вона приймає схематик (schematic) — тип компоненту та його ім'я, після чого генерує необхідні файли та оновлює існуючі модулі.

Базовий синтаксис

nest generate <schematic> <name> [options]

# Скорочений варіант:
nest g <schematic> <name> [options]

Параметри:

  • schematic — тип компоненту (module, controller, service, тощо)
  • name — ім'я компоненту у форматі kebab-case або camelCase
  • options — додаткові прапорці для налаштування генерації

Доступні схематики

СхематикСкороченняПризначенняСтворені файли
modulemoМодуль<name>.module.ts
controllercoКонтролер<name>.controller.ts, <name>.controller.spec.ts
servicesСервіс (провайдер)<name>.service.ts, <name>.service.spec.ts
classclTypeScript клас<name>.ts
interfaceitfTypeScript інтерфейс<name>.interface.ts
guardguGuard (охоронець)<name>.guard.ts, <name>.guard.spec.ts
interceptoritcInterceptor (перехоплювач)<name>.interceptor.ts
middlewaremiMiddleware (мідлвар)<name>.middleware.ts
pipepiPipe (труба валідації)<name>.pipe.ts
filterfException Filter<name>.filter.ts
decoratordКастомний декоратор<name>.decorator.ts
gatewaygaWebSocket Gateway<name>.gateway.ts
resourceresПовний CRUD ресурсmodule, controller, service, DTO
Рекомендація: Використовуйте скорочені форми для швидкості:
  • nest g mo users замість nest g module users
  • nest g co users замість nest g controller users
  • nest g s users замість nest g service users

Структура шляхів

Ім'я компоненту може містити шлях для організації у вкладені папки:

# Створення у кореневій папці src/
nest g module users
# → src/users/users.module.ts

# Створення у вкладеній папці
nest g controller users/admin
# → src/users/admin/admin.controller.ts

# Створення у глибокій ієрархії
nest g service api/v1/users
# → src/api/v1/users/users.service.ts
Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #FFFFFF

folder "src/" {
    folder "users/" #DBEAFE {
        file "users.module.ts" #F1F5F9
        
        folder "admin/" #DCFCE7 {
            file "admin.controller.ts" #F1F5F9
            file "admin.controller.spec.ts" #E2E8F0
        }
    }
    
    folder "api/" #FEF3C7 {
        folder "v1/" #DBEAFE {
            folder "users/" #DCFCE7 {
                file "users.service.ts" #F1F5F9
                file "users.service.spec.ts" #E2E8F0
            }
        }
    }
}

note right of "users.module.ts"
  nest g module users
  Створює папку та модуль
end note

note right of "admin.controller.ts"
  nest g controller users/admin
  Вкладений у існуючий модуль
end note

note right of "users.service.ts"
  nest g service api/v1/users
  Глибока вкладеність
end note

@enduml

Генерація модуля

Модуль (module) — основний будівельний блок архітектури NestJS, що об'єднує пов'язані компоненти (контролери, сервіси) у логічну групу.

Команда генерації

nest generate module <name>

# Скорочення:
nest g mo <name>

Приклад: створення модуля users

nest g module users
$ nest g module users
CREATE src/users/users.module.ts (82 bytes)
UPDATE src/app.module.ts (312 bytes)

Створені файли:

Важливо: CLI автоматично імпортує новий модуль у app.module.ts та додає його до масиву imports. Це забезпечує негайну інтеграцію модуля у застосунок без ручних правок.

Генерація модуля у вкладеній папці

# Модуль у папці features/
nest g mo features/auth
# → src/features/auth/auth.module.ts

# Модуль у папці api/v1/
nest g mo api/v1/products
# → src/api/v1/products/products.module.ts

Результуюча структура:

src/
├── app.module.ts
├── features/
│   └── auth/
│       └── auth.module.ts
└── api/
    └── v1/
        └── products/
            └── products.module.ts

Генерація контролера

Контролер (controller) обробляє вхідні HTTP-запити та визначає маршрути (routes) застосунку.

Команда генерації

nest generate controller <name>

# Скорочення:
nest g co <name>

Приклад: створення контролера users

nest g controller users
$ nest g controller users
CREATE src/users/users.controller.ts (99 bytes)
CREATE src/users/users.controller.spec.ts (485 bytes)
UPDATE src/users/users.module.ts (166 bytes)

Створені файли:

Ключові спостереження:

  1. Автоматична реєстрація: Контролер додано до масиву controllers у UsersModule
  2. Тестовий файл: CLI створює базовий unit-тест (*.spec.ts) для контролера
  3. Іменування маршруту: Декоратор @Controller('users') автоматично отримує префікс з імені
Якщо контролер генерується до модуля, CLI створить модуль автоматично:
# Модуль ще не існує
nest g co products
# → CLI створить products.module.ts та зареєструє контролер

Генерація вкладеного контролера

# Контролер у підпапці admin
nest g co users/admin
# → src/users/admin/admin.controller.ts
# → Реєструється у UsersModule (якщо існує)

Генерація сервісу

Сервіс (service) містить бізнес-логіку застосунку та інкапсулює доступ до даних. Сервіси є провайдерами (providers), що ін'єктуються через Dependency Injection.

Команда генерації

nest generate service <name>

# Скорочення:
nest g s <name>

Приклад: створення сервісу users

nest g service users
$ nest g service users
CREATE src/users/users.service.ts (89 bytes)
CREATE src/users/users.service.spec.ts (453 bytes)
UPDATE src/users/users.module.ts (247 bytes)

Створені файли:

Ключові спостереження:

  1. Декоратор @Injectable(): Позначає клас як провайдера для DI контейнера
  2. Реєстрація у providers: Сервіс додано до масиву providers модуля
  3. Готовність до ін'єкції: Тепер сервіс можна ін'єктувати у контролер або інші сервіси

Використання згенерованого сервісу

Після генерації сервіс можна одразу ін'єктувати у контролер:

// src/users/users.controller.ts
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();
  }
}
// src/users/users.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private users = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' },
  ];
  
  findAll() {
    return this.users;
  }
}

Генерація повного ресурсу (Resource)

nest generate resource — найпотужніша команда CLI, що створює повний набір компонентів для REST API або GraphQL: модуль, контролер, сервіс, DTO (Data Transfer Objects), та entity класи. Це ідеальна команда для швидкого прототипування або створення нових функціональних блоків.

Команда генерації

nest generate resource <name>

# Скорочення:
nest g res <name>

Інтерактивний режим

При виконанні команди CLI запитає кілька питань для налаштування:

nest g resource products
$ nest g resource products
? What transport layer do you use?
❯ REST API
GraphQL (code first)
GraphQL (schema first)
Microservice (non-HTTP)
WebSockets
? Would you like to generate CRUD entry points? Yes
CREATE src/products/products.controller.ts
CREATE src/products/products.controller.spec.ts
CREATE src/products/products.module.ts
CREATE src/products/products.service.ts
CREATE src/products/products.service.spec.ts
CREATE src/products/dto/create-product.dto.ts
CREATE src/products/dto/update-product.dto.ts
CREATE src/products/entities/product.entity.ts
UPDATE src/app.module.ts

Структура згенерованого ресурсу

Що генерує nest g resource

ФайлПризначення
products.controller.tsREST контролер з повним CRUD (Create, Read, Update, Delete)
products.service.tsСервіс з методами-заглушками для бізнес-логіки
products.module.tsМодуль, що об'єднує контролер та сервіс
dto/create-product.dto.tsDTO для створення продукту (POST запит)
dto/update-product.dto.tsDTO для оновлення продукту (PATCH запит)
entities/product.entity.tsEntity клас для представлення моделі даних
products.controller.spec.tsUnit-тест контролера
products.service.spec.tsUnit-тест сервісу
DTO (Data Transfer Object) — об'єкти для передачі даних між шарами застосунку. У REST API DTO визначають структуру вхідних даних для валідації та документації.Entity — клас, що представляє структуру даних у базі даних (використовується з ORM як TypeORM або Prisma).

Переваги nest g resource

Loading diagram...
graph LR
    subgraph "Ручне створення"
        R1["8 файлів вручну"]
        R2["Імпорти та реєстрації"]
        R3["Типізація та інтерфейси"]
        R4["⏱️ 30-45 хвилин"]
        
        R1 --> R2 --> R3 --> R4
        
        style R4 fill:#ef4444,stroke:#b91c1c,color:#ffffff
    end
    
    subgraph "nest g resource"
        G1["1 команда"]
        G2["Всі файли готові"]
        G3["REST endpoints працюють"]
        G4["⏱️ 30 секунд"]
        
        G1 --> G2 --> G3 --> G4
        
        style G4 fill:#22c55e,stroke:#15803d,color:#ffffff
    end
  1. Швидкість: Створення повного CRUD за 30 секунд
  2. Консистентність: Однакова структура у всіх модулях
  3. Best practices: Правильна архітектура "з коробки"
  4. Тести: Базові unit-тести вже включені

Генерація класів та інтерфейсів

Для створення DTO, entity або допоміжних класів використовуються команди nest g class та nest g interface.

Генерація класу (DTO)

nest generate class <path>

# Скорочення:
nest g cl <path>

Приклад: створення DTO для користувача:

nest g class users/dto/create-user.dto --no-spec
$ nest g class users/dto/create-user.dto --no-spec
CREATE src/users/dto/create-user.dto.ts (32 bytes)

Створений файл:

// src/users/dto/create-user.dto.ts
export class CreateUserDto {}

Заповнення DTO валідацією:

import { IsEmail, IsString, MinLength, MaxLength } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  @MinLength(2)
  @MaxLength(50)
  name: string;

  @IsString()
  @MinLength(8)
  password: string;
}

Генерація інтерфейсу

nest generate interface <path>

# Скорочення:
nest g itf <path>

Приклад: створення інтерфейсу для конфігурації:

nest g interface config/database-config.interface
$ nest g interface config/database-config.interface
CREATE src/config/database-config.interface.ts (43 bytes)

Створений файл:

// src/config/database-config.interface.ts
export interface DatabaseConfig {}

Заповнення інтерфейсу:

export interface DatabaseConfig {
  host: string;
  port: number;
  username: string;
  password: string;
  database: string;
}
Клас vs Інтерфейс:
  • Клас — існує у runtime, підтримує декоратори валідації (для DTO)
  • Інтерфейс — лише compile-time типізація, видаляється після компіляції
Для DTO завжди використовуйте класи, оскільки NestJS потребує їх для валідації та трансформації.

Опції генерації

NestJS CLI підтримує кілька корисних опцій для налаштування процесу генерації.

--no-spec: Без тестових файлів

За замовчуванням CLI генерує unit-тести (*.spec.ts) для кожного компонента. Щоб вимкнути це:

nest g service users --no-spec
# → Створює лише users.service.ts (без users.service.spec.ts)

nest g controller products --no-spec
# → Створює лише products.controller.ts

Коли використовувати:

  • Прототипування — тести будуть написані пізніше
  • E2E-first підхід — unit-тести не потрібні
  • Legacy проєкти без тестового покриття
Важливо: У продакшн-проєктах не рекомендується пропускати тести. Використовуйте --no-spec лише для швидкого прототипування.

--flat: Плоска структура без папки

За замовчуванням CLI створює вкладену папку для компонента. Опція --flat розміщує файли у поточній директорії:

# Без --flat (стандартна поведінка):
nest g service logger
# → src/logger/logger.service.ts
# → src/logger/logger.service.spec.ts

# З --flat:
nest g service logger --flat
# → src/logger.service.ts (без папки logger/)
# → src/logger.service.spec.ts

Коли використовувати:

  • Утилітарні сервіси у папці common/
  • Декоратори та pipes у папці shared/
  • Хелпери у папці utils/

--dry-run: Симуляція без змін

Опція --dry-run (скорочення: -d) виконує симуляцію генерації без реального створення файлів. Корисно для перевірки, що буде створено:

nest g resource orders --dry-run
$ nest g resource orders --dry-run
? What transport layer do you use? REST API
? Would you like to generate CRUD entry points? Yes
CREATE (dry run) src/orders/orders.controller.ts
CREATE (dry run) src/orders/orders.controller.spec.ts
CREATE (dry run) src/orders/orders.module.ts
CREATE (dry run) src/orders/orders.service.ts
CREATE (dry run) src/orders/orders.service.spec.ts
CREATE (dry run) src/orders/dto/create-order.dto.ts
CREATE (dry run) src/orders/dto/update-order.dto.ts
CREATE (dry run) src/orders/entities/order.entity.ts
UPDATE (dry run) src/app.module.ts
NOTE: The "dryRun" flag means no changes were made.

Коли використовувати:

  • Перевірка структури перед реальною генерацією
  • Навчання команд CLI
  • Перевірка конфліктів імен файлів

--skip-import: Без реєстрації у модулі

Опція --skip-import створює компонент, але не додає його до жодного модуля:

nest g service auth --skip-import
# → Створює auth.service.ts, але не оновлює auth.module.ts

Коли використовувати:

  • Ручна реєстрація через custom providers
  • Динамічні модулі
  • Експериментальний код

Комбінування опцій

Опції можна комбінувати:

# Сервіс без тестів, плоска структура, dry-run
nest g service logger --no-spec --flat --dry-run

# Контролер без тестів та реєстрації
nest g controller admin --no-spec --skip-import

# Ресурс без тестів у вкладеній папці
nest g resource api/v1/users --no-spec

Команди запуску застосунку

Після генерації компонентів застосунок потрібно запустити. NestJS CLI надає кілька команд для різних режимів роботи.

nest start: Базовий запуск

nest start

Компілює TypeScript у JavaScript та запускає застосунок один раз. Після зупинки сервера потрібно перезапустити вручну.

nest start
$ nest start
[Nest] Webpack is building...
[Nest] Webpack build completed (2.3s)
[Nest] Starting Nest application...
[Nest] AppModule dependencies initialized
[Nest] UsersModule dependencies initialized
[Nest] Nest application successfully started
[Nest] Application is running on: http://localhost:3000

Коли використовувати:

  • Тестування після збірки
  • Запуск у Docker-контейнері
  • Відлагодження проблем компіляції

nest start:dev: Режим розробки з watch

npm run start:dev
# або
nest start --watch

Запускає застосунок у watch mode — автоматично перекомпілює та перезапускає сервер при зміні файлів.

npm run start:dev
$ npm run start:dev
[Nest] Starting compilation in watch mode...
[Nest] Nest application successfully started
[Nest] Application is running on: http://localhost:3000
// Змінюємо users.controller.ts...
[Nest] File change detected. Recompiling...
[Nest] Nest application successfully started

Переваги:

  • Миттєвий feedback loop — зміни застосовуються за 1-2 секунди
  • Не потрібно вручну перезапускати сервер
  • Ідеально для активної розробки
Рекомендація: Використовуйте start:dev як основну команду під час розробки. Це економить години часу протягом проєкту.

nest start:debug: Режим відлагодження

npm run start:debug

Запускає застосунок з підтримкою Node.js debugger на порті 9229. Можна підключитися через Chrome DevTools або VS Code Debugger.

Налаштування VS Code для відлагодження:

// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach NestJS Debugger",
      "port": 9229,
      "restart": true,
      "stopOnEntry": false,
      "protocol": "inspector"
    }
  ]
}

Використання:

  1. Запустіть npm run start:debug
  2. Встановіть breakpoints у VS Code
  3. Натисніть F5 або "Run → Start Debugging"
  4. Виконайте HTTP-запит — виконання зупиниться на breakpoint

nest build: Компіляція для продакшн

nest build

Компілює TypeScript у оптимізований JavaScript код для production:

nest build
$ nest build
[Nest] Building Nest application...
[Nest] Successfully compiled 47 files with TypeScript (3.2s)
Build completed!
Output: dist/

Результат:

dist/
├── main.js
├── main.js.map
├── app.module.js
├── users/
│   ├── users.controller.js
│   ├── users.service.js
│   └── users.module.js
└── ... (всі файли застосунку)

Запуск продакшн-версії:

node dist/main.js

npm run start:prod: Продакшн-режим

npm run start:prod

Виконує nest build та запускає скомпільований код:

# Еквівалентно:
nest build && node dist/main

Коли використовувати:

  • Фінальне тестування перед деплоєм
  • Запуск у production-середовищі (сервер, Docker)
  • Вимірювання продуктивності

Порівняльна таблиця команд запуску

КомандаКомпіляціяWatchDebuggerВикористання
nest start✅ Один раз❌❌Разове тестування
start:dev✅ При змінах✅❌Активна розробка
start:debug✅ При змінах✅✅Відлагодження проблем
nest build✅ Production❌❌Збірка для деплою
start:prod✅ Production❌❌Запуск на сервері

Додаткові корисні команди

Окрім генерації та запуску, CLI надає команди для інформації про проєкт та налаштування.

nest info: Інформація про проєкт

nest info

Виводить версії встановлених пакетів NestJS та залежностей:

nest info
$ nest info
_ _ _ ___ _____ _____ _ _____
| \ | | | | |_ |/ ___|/ __ \| | |_ _|
| \| | ___ ___ | |_ | |\ `--. | / \/| | | |
| . ` | / _ \/ __|| __| | | `--. \| | | | | |
| |\ || __/\__ \| |_ /\__/ //\__/ /| \__/\| |_____| |_
\_| \_/ \___||___/ \__|\____/ \____/ \____/\_____/\___/
[System Information]
OS Version : macOS Sonoma 14.5
NodeJS Version : v20.11.0
npm Version : 10.2.4
[Nest CLI]
Nest CLI Version : 10.4.7
[Nest Platform Information]
platform-express version : 10.4.4
common version : 10.4.4
core version : 10.4.4
cli version : 10.4.7

Коли використовувати:

  • Діагностика проблем з версіями пакетів
  • Створення bug reports
  • Перевірка сумісності залежностей

nest new: Створення нового проєкту

nest new <project-name>

Створює новий NestJS проєкт з нуля:

nest new my-app
$ nest new my-app
? Which package manager would you ❤️ to use?
❯ npm
yarn
pnpm
CREATE my-app/.eslintrc.js
CREATE my-app/.prettierrc
CREATE my-app/nest-cli.json
CREATE my-app/package.json
CREATE my-app/tsconfig.json
CREATE my-app/src/app.controller.ts
CREATE my-app/src/app.service.ts
CREATE my-app/src/main.ts
✔ Installation in progress... ☕
🚀 Successfully created project my-app

Створена структура:

my-app/
├── src/
│   ├── app.controller.ts
│   ├── app.controller.spec.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   ├── app.service.spec.ts
│   └── main.ts
├── test/
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── node_modules/
├── .eslintrc.js
├── .prettierrc
├── nest-cli.json
├── package.json
├── tsconfig.json
└── tsconfig.build.json

Практичні сценарії використання CLI

Розглянемо реальні робочі процеси розробки з використанням NestJS CLI.

Сценарій 1: Створення нового модуля з нуля

Задача: Додати функціональність управління постами у блозі.

Крок 1: Створення структури модуля

# Генерація модуля
nest g module posts
# → src/posts/posts.module.ts

# Генерація контролера
nest g controller posts --no-spec
# → src/posts/posts.controller.ts

# Генерація сервісу
nest g service posts --no-spec
# → src/posts/posts.service.ts

Крок 2: Створення DTO та Entity

# DTO для створення поста
nest g class posts/dto/create-post.dto --no-spec
# → src/posts/dto/create-post.dto.ts

# DTO для оновлення поста
nest g class posts/dto/update-post.dto --no-spec
# → src/posts/dto/update-post.dto.ts

# Entity для моделі поста
nest g class posts/entities/post.entity --no-spec
# → src/posts/entities/post.entity.ts

Результуюча структура:

src/posts/
├── dto/
│   ├── create-post.dto.ts
│   └── update-post.dto.ts
├── entities/
│   └── post.entity.ts
├── posts.controller.ts
├── posts.module.ts
└── posts.service.ts

Альтернатива — одна команда:

# Замість 6 команд вище:
nest g resource posts --no-spec
# → Створює всю структуру автоматично!

Сценарій 2: Модульна архітектура з вкладеністю

Задача: Створити структуру для API v1 з users та products.

# Створення базових модулів
nest g module api/v1/users --no-spec
nest g module api/v1/products --no-spec

# Контролери для кожного модуля
nest g controller api/v1/users --no-spec
nest g controller api/v1/products --no-spec

# Сервіси
nest g service api/v1/users --no-spec
nest g service api/v1/products --no-spec

Результуюча структура:

src/
├── api/
│   └── v1/
│       ├── users/
│       │   ├── users.controller.ts
│       │   ├── users.module.ts
│       │   └── users.service.ts
│       └── products/
│           ├── products.controller.ts
│           ├── products.module.ts
│           └── products.service.ts
└── app.module.ts

Налаштування префіксу маршруту у main.ts:

// src/main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  // Глобальний префікс для всіх маршрутів
  app.setGlobalPrefix('api/v1');
  
  await app.listen(3000);
}
bootstrap();

// Тепер маршрути доступні за адресою:
// GET /api/v1/users
// GET /api/v1/products

Сценарій 3: Спільні утиліти та декоратори

Задача: Створити спільні компоненти для використання у різних модулях.

# Створення папки common
mkdir src/common

# Генерація кастомного декоратора
nest g decorator common/decorators/current-user --flat --no-spec
# → src/common/decorators/current-user.decorator.ts

# Генерація pipe для валідації
nest g pipe common/pipes/parse-int --flat --no-spec
# → src/common/pipes/parse-int.pipe.ts

# Генерація guard для автентифікації
nest g guard common/guards/auth --flat --no-spec
# → src/common/guards/auth.guard.ts

# Генерація interceptor для логування
nest g interceptor common/interceptors/logging --flat --no-spec
# → src/common/interceptors/logging.interceptor.ts

Результуюча структура:

src/common/
├── decorators/
│   └── current-user.decorator.ts
├── pipes/
│   └── parse-int.pipe.ts
├── guards/
│   └── auth.guard.ts
└── interceptors/
    └── logging.interceptor.ts
Опція --flat створює файли без вкладених папок, що зручно для організації спільних компонентів у структуровані директорії.

Сценарій 4: Тестування перед генерацією (dry-run)

Задача: Перевірити, що буде згенеровано без реальних змін.

# Перевірка структури ресурсу
nest g resource notifications --dry-run

# Перевірка вкладеної структури
nest g controller admin/users --dry-run

# Перевірка з опціями
nest g service analytics --no-spec --flat --dry-run
Використання dry-run
$ nest g controller admin/dashboard --no-spec --dry-run
CREATE (dry run) src/admin/dashboard/dashboard.controller.ts
UPDATE (dry run) src/admin/admin.module.ts
NOTE: The "dryRun" flag means no changes were made.
// Все виглядає правильно? Виконуємо без --dry-run:
$ nest g controller admin/dashboard --no-spec
CREATE src/admin/dashboard/dashboard.controller.ts
UPDATE src/admin/admin.module.ts

Переваги dry-run:

  • Перевірка імен файлів перед створенням
  • Виявлення конфліктів з існуючими файлами
  • Планування структури проєкту

Best Practices: ефективна робота з CLI

Рекомендації для максимальної продуктивності при роботі з NestJS CLI.

Правило 1. Використовуйте скорочення команд

❌ Повільно:

nest generate module users
nest generate controller users
nest generate service users

✅ Швидко:

nest g mo users
nest g co users
nest g s users

Або ще краще — одна команда:

nest g resource users

Правило 2. Плануйте структуру заздалегідь

Погана практика — генерація у корені:

nest g mo users
nest g mo products
nest g mo orders
# → src/users/, src/products/, src/orders/ (плоска структура)

Хороша практика — групування за функціоналом:

# Групування за доменом
nest g mo features/auth
nest g mo features/billing
nest g mo features/analytics

# Або версіонування API
nest g mo api/v1/users
nest g mo api/v1/products

Правило 3. Створюйте алиаси для часто використовуваних команд

Додайте до ~/.zshrc або ~/.bashrc:

# NestJS aliases
alias ngs="nest g service"
alias ngc="nest g controller"
alias ngm="nest g module"
alias ngr="nest g resource"
alias ngcl="nest g class"

# З опціями
alias ngs-ns="nest g service --no-spec"
alias ngc-ns="nest g controller --no-spec"

Використання:

ngs users           # → nest g service users
ngc-ns products     # → nest g controller products --no-spec
ngr orders          # → nest g resource orders

Правило 4. Використовуйте --no-spec для прототипування

Під час розробки MVP:

# Швидке прототипування без тестів
nest g resource prototype --no-spec

# Тести додаються пізніше, коли логіка стабілізується

У стабільних проєктах:

# Завжди з тестами
nest g resource users
# → Створює *.spec.ts файли
Компроміс: Використовуйте --no-spec для експериментального коду та первинного прототипування. Як тільки функціональність стабілізується — напишіть тести вручну або регенеруйте компоненти з тестами.

Правило 5. Перевіряйте структуру через dry-run

Перед масовою генерацією:

# Спочатку симуляція
nest g resource api/v2/users --dry-run

# Переконалися, що структура правильна
nest g resource api/v2/users

Правило 6. Організуйте спільні компоненти у common/

Структура для спільних компонентів:

# Декоратори
nest g decorator common/decorators/roles --flat --no-spec

# Guards
nest g guard common/guards/roles --flat --no-spec

# Interceptors
nest g interceptor common/interceptors/transform --flat --no-spec

# Pipes
nest g pipe common/pipes/validation --flat --no-spec

# Filters
nest g filter common/filters/http-exception --flat --no-spec

Результуюча структура:

src/common/
├── decorators/
│   ├── roles.decorator.ts
│   └── current-user.decorator.ts
├── guards/
│   ├── roles.guard.ts
│   └── auth.guard.ts
├── interceptors/
│   ├── transform.interceptor.ts
│   └── logging.interceptor.ts
├── pipes/
│   └── validation.pipe.ts
└── filters/
    └── http-exception.filter.ts

Налаштування CLI через nest-cli.json

Файл nest-cli.json дозволяє налаштувати поведінку CLI для всього проєкту.

Базова конфігурація

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true,
    "webpack": true,
    "tsConfigPath": "tsconfig.build.json"
  },
  "generateOptions": {
    "spec": false,
    "flat": false
  }
}

Опції generateOptions

ОпціяТипЗа замовчуваннямОпис
specbooleantrueГенерувати тестові файли *.spec.ts
flatbooleanfalseСтворювати файли без вкладеної папки
specFileSuffixstring"spec"Суфікс для тестових файлів

Приклад: вимкнення тестів глобально

{
  "generateOptions": {
    "spec": false
  }
}

Тепер всі команди nest g будуть працювати як з прапорцем --no-spec:

nest g service users
# → Створює лише users.service.ts (без users.service.spec.ts)
Важливо: Налаштування у nest-cli.json застосовуються глобально для всього проєкту. Для одноразової зміни поведінки краще використовувати опції командного рядка (--no-spec, --flat).

Резюме команд CLI

🚀 Генерація компонентів

  • nest g module <name> — модуль
  • nest g controller <name> — контролер
  • nest g service <name> — сервіс
  • nest g resource <name> — повний CRUD ресурс
  • nest g class <name> — клас (DTO, Entity)
  • nest g interface <name> — інтерфейс

⚙️ Опції генерації

  • --no-spec — без тестових файлів
  • --flat — без вкладеної папки
  • --dry-run — симуляція без змін
  • --skip-import — без реєстрації у модулі

▶️ Запуск застосунку

  • nest start — одноразовий запуск
  • npm run start:dev — watch mode (розробка)
  • npm run start:debug — з debugger
  • nest build — збірка для production
  • npm run start:prod — запуск production

📋 Інформація

  • nest --version — версія CLI
  • nest info — інформація про проєкт
  • nest --help — список всіх команд
  • nest g --help — допомога по генерації

Порівняльна таблиця: ручна vs CLI генерація

АспектРучне створенняNestJS CLI
Швидкість10-15 хвилин30 секунд
ПомилкиВисокий ризикМінімальний
КонсистентністьЗалежить від розробникаГарантована
ІмпортиВручнуАвтоматично
РеєстраціяВручнуАвтоматично
ТестиВручнуВключені
СтруктураДовільнаBest practices
Підсумкова рекомендація: NestJS CLI — ваш головний інструмент для прискорення розробки. Використовуйте nest g resource для швидкого створення функціональних модулів, --dry-run для перевірки структури та start:dev як основний режим розробки. Це економить години часу та забезпечує консистентну архітектуру проєкту.
Copyright © 2026