Что такое пайпы в контексте NestJS?
Пайпы (pipes) в NestJS — это специальный класс, который позволяет обрабатывать входящие данные перед их передачей в обработчик маршрута. Они могут использоваться для валидации, трансформации или обогащения данных. Пайпы обеспечивают уровень, на котором можно выполнить предварительную обработку данных, что способствует более чистой архитектуре приложения и улучшает его масштабируемость.
Создание собственного пайпа
Чтобы создать пайп, нужно реализовать интерфейс PipeTransform
, который требует определения метода transform
. Давайте рассмотрим пример.
Создадим пайп, который будет проверять, что входные данные являются целым числом.
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class ParseIntPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
const val = parseInt(value, 10);
if (isNaN(val)) {
throw new BadRequestException('Validation failed: not an integer');
}
return val;
}
}
В этом коде ParseIntPipe
проверяет значение, поступающее в обработчик, и если значение не может быть преобразовано в целое число, кидает исключение BadRequestException
.
Теперь мы можем использовать наш пайп в контроллере.
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get(':id')
getCat(@Param('id', ParseIntPipe) id: number) {
return `Cat ${id}`;
}
}
В этом примере, когда пользователь отправляет GET-запрос на /cats/abc
, будет выброшено исключение, поскольку "abc" не может быть преобразовано в целое число. Если же запрос будет на /cats/123
, то id
будет равен 123.
Встроенные пайпы
NestJS уже предоставляет несколько встроенных пайпов, таких как ValidationPipe
, который облегчает валидацию входных данных, используя такие библиотеки, как class-validator
. Вот пример его использования:
import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { ValidateNested, IsString } from 'class-validator';
class CreateCatDto {
@IsString()
name: string;
@IsString()
breed: string;
}
@Controller('cats')
export class CatsController {
@Post()
@UsePipes(new ValidationPipe())
create(@Body() createCatDto: CreateCatDto) {
return createCatDto;
}
}
В этом примере, если объект, отправленный в теле POST-запроса, не имеет строковых значений для name
или breed
, будет возвращена ошибка валидации.
Заключение
Пайпы в NestJS — это мощный инструмент для обработки входящих данных, который может значительно упростить работу с валидацией и преобразованием данных. Они помогают поддерживать чистый код и улучшать читаемость и поддерживаемость приложения. Пользуясь встроенными пайпами и создавая свои собственные, разработчики могут гибко настраивать поведение своего приложения в соответствии с требованиями бизнес-логики.