Параметры, query и тело запроса
Запрос несёт данные в трёх местах: в самом адресе (/posts/5), в строке запроса после знака вопроса (/posts?page=2) и в теле — например, JSON с новой статьёй. Для каждого места в NestJS есть декоратор параметра: он ставится перед аргументом метода, и фреймворк сам кладёт туда нужное значение.
Параметр маршрута
Часть адреса с двоеточием — параметр. Декоратор @Param() достаёт его по имени:
// src/posts/posts.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
@Controller('posts')
export class PostsController {
@Get(':id')
findOne(@Param('id') id: string) {
return `Статья номер ${id}`;
}
}Откройте http://localhost:3000/posts/5 — появится текст «Статья номер 5». Значение всегда приходит строкой, даже если в адресе цифры. Как превратить его в число, показано в уроке о пайпах.
Параметров может быть несколько:
// src/posts/posts.controller.ts
@Get(':postId/comments/:commentId')
findComment(
@Param('postId') postId: string,
@Param('commentId') commentId: string,
) {
return `Комментарий ${commentId} к статье ${postId}`;
}Адрес /posts/5/comments/12 вернёт «Комментарий 12 к статье 5».
Строка запроса
Параметры после ? читает декоратор @Query():
// src/posts/posts.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
@Controller('posts')
export class PostsController {
@Get()
findAll(@Query('page') page?: string, @Query('search') search?: string) {
return { page: page ?? '1', search: search ?? '' };
}
}Адрес /posts?page=2&search=nest вернёт {"page":"2","search":"nest"}. Если параметра в адресе нет, аргумент равен undefined, поэтому он помечен как необязательный.
Тело запроса
Данные из тела POST- и PATCH-запросов достаёт @Body(). NestJS сам разбирает JSON — подключать ничего не нужно:
// src/posts/posts.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
@Controller('posts')
export class PostsController {
@Post()
create(@Body() body: { title: string; content: string }) {
return { message: 'Статья создана', title: body.title };
}
}Отправьте запрос из терминала:
curl -X POST http://localhost:3000/posts \
-H "Content-Type: application/json" \
-d '{"title":"Привет, Nest","content":"Первая статья"}'Сервер ответит {"message":"Статья создана","title":"Привет, Nest"}. Если передать в @Body() имя поля, например @Body('title'), придёт только оно.
Сводка
| Декоратор | Откуда данные | Пример адреса |
|---|---|---|
@Param('id') | Часть адреса | /posts/5 |
@Query('page') | Строка запроса | /posts?page=2 |
@Body() | Тело запроса | POST /posts с JSON |
@Headers('user-agent') | Заголовок | любой |
Частая ошибка
Клиент отправляет JSON, но забывает заголовок Content-Type: application/json. Тогда Express не разбирает тело, и вместо данных в body приходит undefined или пустой объект. Если в @Body() пусто, первым делом проверьте этот заголовок — в curl, Postman или в fetch() на фронтенде.