Пошук уроків, статей та іншого контенту
Навчитеся створювати модулі, контролери й сервіси за допомогою Nest CLI та керувати типовими командами проєкту.
Nest CLI — це командний інструмент для створення NestJS-проєктів і типових елементів застосунку:
модулів;
контролерів;
сервісів;
guard-ів;
middleware;
interceptor-ів;
інших файлів і ресурсів.
CLI автоматизує створення файлів, директорій і, у багатьох випадках, оновлення відповідного модуля.
Для глобального встановлення CLI виконайте:
npm install -g @nestjs/cliПеревірити встановлення можна командою:
nest --versionТакож CLI можна запускати без глобального встановлення через npx:
npx @nestjs/cli --versionГлобальне встановлення зручне для регулярної роботи з NestJS. npx дає змогу запускати CLI без додаткового глобального пакета.
Створіть новий NestJS-проєкт командою:
nest new my-apiCLI поставить кілька запитань:
який менеджер пакетів використовувати;
чи потрібно встановити залежності.
Після створення перейдіть до директорії проєкту:
cd my-apiТипова структура нового проєкту має такий вигляд:
my-api/
├── src/
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test/
├── package.json
├── tsconfig.json
└── nest-cli.jsonОсновна директорія з кодом — src.
Запустіть застосунок у режимі розробки:
npm run start:devУ цьому режимі Nest автоматично перезапускає застосунок після зміни файлів.
Типові скрипти в package.json:
npm run start
npm run start:dev
npm run start:debug
npm run build
npm run start:prod
npm run lint
npm run testЇхнє призначення:
start — звичайний запуск застосунку;
start:dev — запуск із відстеженням змін;
start:debug — запуск у режимі налагодження;
build — компіляція TypeScript у JavaScript;
start:prod — запуск скомпільованого застосунку;
lint — перевірка стилю коду;
test — запуск тестів.
Основна форма команди Nest CLI:
nest generate <тип> <назва>Замість повного generate можна використовувати скорочення g:
nest g <тип> <назва>Наприклад, ці команди еквівалентні:
nest generate module users
nest g module usersЩоб переглянути доступні команди:
nest --helpЩоб переглянути допомогу для конкретної команди:
nest generate --help
nest generate controller --helpМодуль групує пов’язану функціональність застосунку.
Створіть модуль users:
nest g module usersCLI зазвичай створить файл:
src/users/users.module.tsЙого початковий вміст може виглядати так:
import { Module } from '@nestjs/common';
@Module({})
export class UsersModule {}Модуль можна створити в конкретній директорії:
nest g module features/usersУ такому разі файл буде створено приблизно тут:
src/features/users/users.module.ts--flatЗа замовчуванням CLI створює для елемента окрему директорію. Прапорець --flat забороняє створення додаткової директорії:
nest g module users --flatРезультат:
src/users.module.tsКороткий варіант прапорця:
nest g mo users --flatКонтролер обробляє HTTP-запити та повертає відповіді клієнту.
Створіть контролер:
nest g controller usersCLI створить приблизно такі файли:
src/users/
├── users.controller.spec.ts
└── users.controller.tsБазовий контролер:
import { Controller } from '@nestjs/common';
@Controller('users')
export class UsersController {}Декоратор @Controller('users') визначає базовий шлях контролера. Наприклад, метод із декоратором @Get() у цьому контролері відповідатиме на запит GET /users.
CLI зазвичай створює також файл із тестами. Якщо він не потрібен, використайте --no-spec:
nest g controller users --no-specТоді буде створено лише файл контролера.
Сервіс містить прикладну логіку, яку не варто розміщувати безпосередньо в контролері.
Створіть сервіс:
nest g service usersCLI створить:
src/users/
├── users.service.spec.ts
└── users.service.tsПочатковий сервіс:
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {}Декоратор @Injectable() дозволяє Nest керувати екземпляром сервісу через систему dependency injection.
Типова послідовність для функціональності користувачів:
nest g module users
nest g controller users --no-spec
nest g service users --no-specПісля цього структура може мати такий вигляд:
src/users/
├── users.controller.ts
├── users.module.ts
└── users.service.tsCLI також намагається додати контролер і сервіс до UsersModule.
Модуль матиме приблизно такий вигляд:
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}Щоб функціональність була доступна в застосунку, UsersModule має бути імпортований у кореневий модуль:
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule {}У багатьох випадках Nest CLI додає цей імпорт автоматично. Після генерації все одно варто перевірити app.module.ts.
Розглянемо невеликий приклад, який повертає список користувачів.
Файл src/users/users.service.ts:
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private readonly users = [
{ id: 1, name: 'Олена' },
{ id: 2, name: 'Андрій' },
];
findAll() {
return this.users;
}
}Файл 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.module.ts:
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}Файл src/app.module.ts:
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule {}Запустіть застосунок:
npm run start:devПісля цього запит:
GET http://localhost:3000/usersповерне:
[
{
"id": 1,
"name": "Олена"
},
{
"id": 2,
"name": "Андрій"
}
]Для найпоширеніших генераторів CLI підтримує скорочені назви:
nest g mo users
nest g co users
nest g s usersВони відповідають таким командам:
nest g module users
nest g controller users
nest g service usersПовні назви зазвичай зрозуміліші на початку навчання, а скорочення зручні під час щоденної роботи.
Згенерувати guard:
nest g guard authЗгенерувати interceptor:
nest g interceptor loggingЗгенерувати middleware:
nest g middleware loggerЗгенерувати pipe:
nest g pipe validationДля кожного генератора можна переглянути доступні параметри:
nest g guard --helpКоманди генерації потрібно виконувати з кореня NestJS-проєкту — там, де розташований nest-cli.json або package.json.
Правильно:
cd my-api
nest g module usersЯкщо модуль, контролер або сервіс уже існує, повторна генерація може призвести до конфлікту файлів або небажаних змін.
Перед генерацією перевірте структуру src.
Якщо контролер створений, але маршрут не працює, перевірте:
чи контролер додано до controllers відповідного модуля;
чи сервіс додано до providers;
чи модуль імпортовано в AppModule.
Якщо контролер має такий декоратор:
@Controller('users')його маршрут починається з /users. Запит до /user або /api/users не працюватиме, якщо для цього немає окремої конфігурації.
Якщо для навчального прикладу тестові файли не потрібні, використовуйте:
nest g service users --no-specАле в реальному проєкті тестові файли часто корисні, тому не варто вимикати їх без причини.
Для нової функціональності з назвою products можна виконати:
nest g module products
nest g controller products
nest g service products
npm run start:devПісля цього:
перевірте створені файли;
переконайтеся, що контролер і сервіс додані до модуля;
підключіть модуль до AppModule, якщо CLI не зробив цього автоматично;
додайте методи сервісу;
додайте маршрути контролера;
перевірте результат HTTP-запитами.
Nest CLI створює проєкти та типові елементи NestJS.
Новий проєкт створюється командою nest new <назва>.
Модуль створюється через nest g module <назва>.
Контролер створюється через nest g controller <назва>.
Сервіс створюється через nest g service <назва>.
Скорочення g, mo, co і s допомагають швидше вводити команди.
Прапорець --no-spec вимикає створення тестового файлу.
Після генерації потрібно перевірити зв’язки між модулем, контролером і сервісом.
Для розробки найчастіше використовується команда npm run start:dev.