Пошук уроків, статей та іншого контенту
Створите контролер і навчитеся пов’язувати його з модулем для обробки запитів.
Контролер у NestJS відповідає за обробку вхідних HTTP-запитів. Він визначає:
для яких URL-адрес працює;
які HTTP-методи підтримує;
який код виконується після отримання запиту;
яку відповідь потрібно повернути клієнту.
Контролер створюється за допомогою декоратора @Controller().
Найпростіший контролер:
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll() {
return ['Анна', 'Олег'];
}
}У цьому прикладі:
@Controller('users') задає базовий шлях /users;
@Get() вказує, що метод обробляє GET-запити;
findAll() повертає масив користувачів.
Якщо запустити застосунок і надіслати GET-запит на /users, NestJS виконає метод findAll().
Контролер можна створити вручну або за допомогою Nest CLI. CLI автоматично створює файл із правильною структурою:
nest g controller usersСкорочений варіант команди:
nest g co usersЗазвичай команда створює файл users/users.controller.ts приблизно з таким вмістом:
import { Controller } from '@nestjs/common';
@Controller('users')
export class UsersController {}Значення users у декораторі @Controller() є префіксом усіх маршрутів цього контролера.
Для обробки GET-запиту використовується декоратор @Get():
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll() {
return [
{ id: 1, name: 'Анна' },
{ id: 2, name: 'Олег' },
];
}
}Метод findAll() буде викликатися для запиту:
GET /usersNestJS автоматично перетворить повернене значення на HTTP-відповідь у форматі JSON.
До @Get() можна передати шлях:
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get('active')
findActive() {
return [
{ id: 1, name: 'Анна' },
];
}
}Тепер метод обробляє запит:
GET /users/activeЗагальний маршрут складається з двох частин:
@Controller('users') + @Get('active') = /users/activeNestJS має декоратори для основних HTTP-методів:
@Get() — отримання даних;
@Post() — створення даних;
@Put() — повна зміна даних;
@Patch() — часткова зміна даних;
@Delete() — видалення даних.
Наприклад:
import {
Body,
Controller,
Delete,
Get,
Param,
Patch,
Post,
} from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll() {
return [
{ id: 1, name: 'Анна' },
{ id: 2, name: 'Олег' },
];
}
@Get(':id')
findOne(@Param('id') id: string) {
return {
id: Number(id),
name: 'Анна',
};
}
@Post()
create(@Body() body: { name: string }) {
return {
id: 3,
name: body.name,
};
}
@Patch(':id')
update(
@Param('id') id: string,
@Body() body: { name?: string },
) {
return {
id: Number(id),
name: body.name,
};
}
@Delete(':id')
remove(@Param('id') id: string) {
return {
message: `Користувача з ідентифікатором ${id} видалено`,
};
}
}Цей контролер обробляє такі маршрути:
GET /users
GET /users/:id
POST /users
PATCH /users/:id
DELETE /users/:idПараметр маршруту позначається двокрапкою:
@Get(':id')
findOne(@Param('id') id: string) {
return `Користувач з ідентифікатором ${id}`;
}Для запиту:
GET /users/42значення параметра id буде дорівнювати рядку "42".
@Param('id') id: stringДекоратор @Param('id') отримує параметр із URL.
Усі параметри маршруту надходять як рядки. Якщо потрібне число, його потрібно перетворити:
const userId = Number(id);Для отримання даних із тіла POST-, PUT- або PATCH-запиту використовується декоратор @Body():
@Post()
create(@Body() body: { name: string }) {
return {
message: 'Користувача створено',
user: body,
};
}Якщо клієнт надішле такий JSON:
{
"name": "Марія"
}метод отримає його через параметр body.
Можна отримати окреме поле:
@Post()
create(@Body('name') name: string) {
return {
name,
};
}У такому випадку @Body('name') поверне лише значення поля name.
Створення класу контролера недостатньо. NestJS має знати, до якого модуля він належить.
Модуль описується декоратором @Module(). Контролери додаються до властивості controllers.
Файл users/users.module.ts:
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
})
export class UsersModule {}Тут UsersController імпортується та додається до масиву controllers.
Щоб NestJS завантажив UsersModule, його потрібно додати до imports кореневого модуля.
Файл src/app.module.ts:
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule {}Після цього структура може мати такий вигляд:
src/
├── app.module.ts
└── users/
├── users.controller.ts
└── users.module.tsПовний приклад контролера:
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll() {
return [
{ id: 1, name: 'Анна' },
{ id: 2, name: 'Олег' },
];
}
@Get(':id')
findOne(@Param('id') id: string) {
return {
id: Number(id),
name: 'Анна',
};
}
@Post()
create(@Body() body: { name: string }) {
return {
id: 3,
name: body.name,
};
}
}Файл модуля:
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
})
export class UsersModule {}Кореневий модуль:
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule {}Запустіть застосунок у режимі розробки:
npm run start:devПісля запуску можна перевірити маршрути:
curl http://localhost:3000/usersОчікувана відповідь:
[
{
"id": 1,
"name": "Анна"
},
{
"id": 2,
"name": "Олег"
}
]Запит із параметром:
curl http://localhost:3000/users/1Запит для створення користувача:
curl -X POST http://localhost:3000/users \
-H "Content-Type: application/json" \
-d '{"name":"Марія"}'Очікувана відповідь:
{
"id": 3,
"name": "Марія"
}Якщо клас контролера не вказано в controllers, NestJS не зареєструє його маршрути:
@Module({
controllers: [UsersController],
})
export class UsersModule {}Якщо UsersModule не додано до imports кореневого модуля, його контролер також не буде доступний:
@Module({
imports: [UsersModule],
})
export class AppModule {}Для такого коду:
@Controller('users')
@Get('active')правильний маршрут:
/users/activeа не /active і не /users.
У запиті:
GET /users/10значення 10 є параметром маршруту й отримується через @Param().
У запиті POST:
{
"name": "Марія"
}значення name є тілом запиту й отримується через @Body().
Параметри URL мають тип string:
@Get(':id')
findOne(@Param('id') id: string) {
return Number(id);
}Якщо використати id без перетворення, він залишиться рядком.
Контролер обробляє HTTP-запити.
@Controller() задає базовий шлях контролера.
@Get(), @Post(), @Patch() та інші декоратори визначають HTTP-методи.
@Param() отримує параметри з URL.
@Body() отримує дані з тіла запиту.
Контролер потрібно додати до controllers відповідного модуля.
Модуль із контролером потрібно імпортувати до кореневого модуля.
Повернене методом контролера значення стає HTTP-відповіддю.