Поиск по сайту
Ctrl + K
Вопросы по Nest.js

Что такое пайпы в контексте 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 — это мощный инструмент для обработки входящих данных, который может значительно упростить работу с валидацией и преобразованием данных. Они помогают поддерживать чистый код и улучшать читаемость и поддерживаемость приложения. Пользуясь встроенными пайпами и создавая свои собственные, разработчики могут гибко настраивать поведение своего приложения в соответствии с требованиями бизнес-логики.