Skip to main content

Що таке Pipe?

1. Що таке Pipe в NestJS

Pipe - це клас, який реалізує інтерфейс PipeTransform і має метод transform(value, metadata).

Пайпи:

  • приймають вхідні дані (наприклад, req.body, req.params, req.query);
  • можуть змінювати чи валідувати їх;
  • повертають перетворене значення, яке потім отримує метод контролера;
  • або кидають помилку, якщо дані некоректні.

Приклад простого pipe:

javascript
import { PipeTransform, Injectable } from '@nestjs/common'; @Injectable() export class UpperCasePipe implements PipeTransform { transform(value: any) { return typeof value === 'string' ? value.toUpperCase() : value; } }

Тепер, якщо ти застосуєш його до параметра контролера - значення буде автоматично перетворене на верхній регістр.

2. Де застосовуються Pipes

Ти можеш використовувати Pipes на трьох рівнях:

РівеньПрикладОбласть дії
Параметр@Body(new ValidationPipe())Лише на одному параметрі
Метод@UsePipes(ValidationPipe)Для всіх параметрів методу
Контролер / Глобальноapp.useGlobalPipes(new ValidationPipe())Для всього застосунку

Приклад застосування на рівні параметра:

javascript
@Get(':id') getUser(@Param('id', ParseIntPipe) id: number) { // id уже автоматично перетворено на number return this.userService.findById(id); }

Якщо користувач викличе /users/123, то id усередині функції буде числом 123, а не рядком '123'.

Якщо значення не можна перетворити - Nest кине помилку BadRequestException.

3. Типи пайпів

ТипПризначенняПриклад
Transformation PipesПеретворюють вхідні дані (string → number, trim тощо)ParseIntPipe, ParseBoolPipe
Validation PipesПеревіряють коректність данихValidationPipe (з class-validator)
Custom PipesБудь-яка своя логіка (наприклад, sanitize, normalize)SlugifyPipe, TrimPipe

4. Найчастіше використовуваний - ValidationPipe

NestJS надає вбудований ValidationPipe, який працює з пакетами class-validator і class-transformer.

Приклад:

javascript
import { IsString, IsEmail, Length } from 'class-validator'; export class CreateUserDto { @IsString() @Length(3, 30) name: string; @IsEmail() email: string; }
javascript
@Post() createUser(@Body(new ValidationPipe()) dto: CreateUserDto) { return this.userService.create(dto); }

Тепер Nest автоматично:

  1. Перетворює JSON із тіла запиту в екземпляр CreateUserDto;
  2. Перевірить поля через class-validator;
  3. Якщо валідація не пройдена - поверне 400 Bad Request із детальним описом помилок.

5. Приклад глобального ValidationPipe

Зазвичай вмикається один раз у main.ts:

javascript
import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes( new ValidationPipe({ transform: true, // автоматично приводить типи (string → number) whitelist: true, // видаляє поля, яких немає в DTO forbidNonWhitelisted: true, // кидає помилку при зайвих полях }), ); await app.listen(3000); } bootstrap();

Тепер усі вхідні дані в контролерах проходять валідацію без явного вказання Pipe.

6. Приклад власного Pipe для перевірки id

javascript
import { PipeTransform, BadRequestException } from '@nestjs/common'; export class ParseObjectIdPipe implements PipeTransform<string> { transform(value: string) { const isValid = /^[0-9a-fA-F]{24}$/.test(value); if (!isValid) { throw new BadRequestException('Invalid MongoDB ObjectId'); } return value; } }

Використання:

javascript
@Get(':id') getUser(@Param('id', new ParseObjectIdPipe()) id: string) { return this.userService.findById(id); }

7. Коли варто використовувати Pipes

ЗадачаРішення
Конвертація типів (string → number)ParseIntPipe
Валідація DTOValidationPipe
Очищення даних (trim, lowercase)Кастомний pipe
Перевірка параметрівКастомний pipe (CheckUuidPipe, ParseObjectIdPipe)
Перетворення вхідних данихTransformPipe, NormalizePipe

8. Підсумок

Pipe у NestJS - це механізм, який виконує:

  • валідацію вхідних даних,
  • перетворення типів,
  • нормалізацію даних до того, як вони потраплять у контролер.

Пайпи:

  • Реалізують інтерфейс PipeTransform;
  • Працюють до виклику обробника;
  • Можуть бути локальними, методовими чи глобальними;
  • Часто застосовуються для DTO-валідації й типізації вхідних даних.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.