Вопросы по Nest.js

Что такое пайпы в контексте NestJS?

Пайпы (pipes) в NestJS — это специальный класс, который позволяет обрабатывать входящие данные перед их передачей в обработчик маршрута. Они могут использоваться для валидации, трансформации или обогащения данных. Пайпы обеспечивают уровень, на котором можно выполнить предварительную обработку данных, что способствует более чистой архитектуре приложения и улучшает его масштабируемость.

Создание собственного пайпа

Чтобы создать пайп, нужно реализовать интерфейс PipeTransform, который требует определения метода transform. Давайте рассмотрим пример.

  1. Создание нового пайпа:

Создадим пайп, который будет проверять, что входные данные являются целым числом.

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.

  1. Использование пайпа в контроллере:

Теперь мы можем использовать наш пайп в контроллере.

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