Контроллеры и маршруты
Контроллер — класс, который принимает HTTP-запросы и возвращает ответ. Каждый его метод связан с адресом и HTTP-методом через декораторы, поэтому отдельного файла с маршрутами в NestJS нет.
Создание контроллера
nest g controller postsCLI создаст src/posts/posts.controller.ts и добавит класс в controllers модуля PostsModule. Напишите первый маршрут:
// src/posts/posts.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('posts')
export class PostsController {
@Get()
findAll() {
return [
{ id: 1, title: 'Первая статья' },
{ id: 2, title: 'Вторая статья' },
];
}
}Строка в @Controller('posts') — префикс для всех маршрутов класса, а @Get() без аргумента означает «GET-запрос на сам префикс». Откройте http://localhost:3000/posts — браузер покажет массив в формате JSON.
Методы HTTP
Для каждого метода HTTP есть свой декоратор, а в его аргументе — продолжение адреса:
// src/posts/posts.controller.ts
import { Controller, Delete, Get, Patch, Post } from '@nestjs/common';
@Controller('posts')
export class PostsController {
@Get()
findAll() {
return 'Список статей';
}
@Get('popular')
findPopular() {
return 'Популярные статьи';
}
@Post()
create() {
return 'Статья создана';
}
@Patch(':id')
update() {
return 'Статья изменена';
}
@Delete(':id')
remove() {
return 'Статья удалена';
}
}| Декоратор | Запрос |
|---|---|
@Get() | GET /posts |
@Get('popular') | GET /posts/popular |
@Post() | POST /posts |
@Patch(':id') | PATCH /posts/5 |
@Delete(':id') | DELETE /posts/5 |
Запросы, кроме GET, из адресной строки браузера не отправить. Проверьте их через curl:
curl -X POST http://localhost:3000/posts
curl -X DELETE http://localhost:3000/posts/5В терминале появятся строки Статья создана и Статья удалена.
Что можно вернуть
- Строку — клиент получит её как текст.
- Объект или массив — NestJS превратит его в JSON и добавит заголовок
Content-Type: application/json. - Промис — NestJS дождётся результата. Поэтому методы можно объявлять с
async.
Код ответа по умолчанию — 200, а для @Post() — 201. Другой код задаёт декоратор @HttpCode():
// src/posts/posts.controller.ts
import { Delete, HttpCode } from '@nestjs/common';
@Delete(':id')
@HttpCode(204)
remove() {}Код 204 означает «успешно, тела ответа нет».
Частая ошибка
Маршруты одного контроллера проверяются в порядке объявления. Если @Get(':id') стоит выше @Get('popular'), запрос /posts/popular попадёт в первый метод, и id окажется равен строке popular. Объявляйте маршруты с фиксированными адресами выше маршрутов с параметрами.