Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Параметры, 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() на фронтенде.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.