NestJS: контроллеры

Контроллеры получили широкое распространение в MVC. Контроллеры служат в качестве точки входа. Они получают запрос клиента от маршрута и передают его дальше. После обработки запроса контроллер генерирует ответ из полученных данных. Контроллер отправляет этот ответ обратно клиенту.

В NestJS также есть контроллеры. На самом деле это класс ES6, обернутый в декоратор @Controller, который импортируется из ‘@nestjs/common’.

Контроллеры могут быть созданы специальной командой в командной строке. Мы можем использовать для этого nest CLI.

nest g controller products
Вход в полноэкранный режим Выйти из полноэкранного режима

Здесь

  • ‘g’ означает генерировать
  • ‘controller’ — то, что мы хотим сгенерировать
  • ‘products’ — имя контроллера.

Но вы также можете создать контроллер самостоятельно без CLI.

Все контроллеры в NestJS регистрируются в Module.
Давайте посмотрим на код:

import { Controller, Get } from '@nestjs/common';

@Controller('products')
export class ProductController {
  @Get()
  getAllProducts(): Product[] {
    // Code...
    return products;
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Этот декоратор имеет необязательный аргумент типа string — это часть пути или его префикс. Этот URL получает запрос от клиента. Внутри класса контроллера определяются методы — обработчики, которые будут работать с запросом от клиента. Методы также обернуты в декораторы по имени HTTP-методов — @Get, @Post, @Put, @Delete, @Patch, @Options, @Head. Каждый из этих декораторов также принимает необязательный параметр строкового типа — конечный путь. Таким образом, префикс, заданный в аргументе контроллера, и путь, указанный в декораторе метода, определяют конечную точку.

import { Controller, Get, Post } from '@nestjs/common';

@Controller('products')
export class ProductController {
  @Get()
  getAllProduct(): Product[]{
    // Code...
    return products;
  }

  @Post()
  create(): string {
    // Code...
    return 'Product has been added';
  }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Все эти имена методов соответствуют HTTP-методам, которые ожидает обработчик. Те, если на определенной конечной точке установлен декоратор @Post(), то при формировании запроса к этой конечной точке со стороны клиента необходимо указать, что будет использоваться метод HTTP POST. В противном случае вы получите ответ, что данный метод недоступен.

По умолчанию, если обработка прошла успешно, контроллер возвращает в ответе статус 200. Это поведение можно изменить с помощью декоратора @HttpCode на уровне обработчика запроса. Если статус ответа внутри метода контроллера будет зависеть от различных факторов, то можно использовать специальный объект ответа. Для этого в метод нужно вставить аргумент с декоратором @Res().

import { Controller, Get, Post, Res, HttpStatus } from '@nestjs/common';
import { Response } from 'express';

@Controller('products')
export class ProductController {
  @Get()
  getAllProduct(@Res() res: Response) {
     // Code...
     res.status(HttpStatus.OK).json(products);
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Контроллеры в NestJS позволяют нам легко создавать API — если из контроллера возвращается объект или массив, этот объект или массив автоматически сериализуется в JSON. Примитивные типы (строка, число, булево и т.д.) возвращаются без сериализации.

Декоратор @Req() используется для получения и обработки запроса от клиента. Как и в случае с ответом, в метод нужно вставить аргумент с данным декоратором. И после этого мы можем работать с объектом запроса.

import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller('products')
export class ProductsController {
  @Get()
  getAllProducts(@Req() request: Request): Product[]{
    // Code...
    return products;
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Если вам нужно установить определенные заголовки ответа в отдельном методе, то это можно сделать с помощью декоратора @Header().

Также я хочу рассказать, как работать с параметрами GET-запроса. Бывает, что определенные GET-параметры передаются от клиента в строке пути. Чтобы обработать их, нужно передать определенный аргумент декоратору метода.

import { Controller, Get, Param } from '@nestjs/common';

// Code...
@Get(':id')
findOneProduct(@Param() params): Product {
  console.log(params.id);
  // Code...
  return product;
}
Вход в полноэкранный режим Выйти из полноэкранного режима

В целом, это все базовые знания о контроллерах в NestJS, которые вам необходимы, чтобы начать писать свое приложение. NestJS предоставляет большие возможности для работы с контроллерами — о них вы можете узнать из документации на сайте фреймворка.

Спасибо за внимание!

Оцените статью
Procodings.ru
Добавить комментарий