Encodera

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

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

Оглавление

Контроллеры и маршруты

Контроллер — класс, который принимает HTTP-запросы и возвращает ответ. Каждый его метод связан с адресом и HTTP-методом через декораторы, поэтому отдельного файла с маршрутами в NestJS нет.

Создание контроллера

nest g controller posts

CLI создаст 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. Объявляйте маршруты с фиксированными адресами выше маршрутов с параметрами.

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

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