Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Pipe?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Pipe - клас, що реалізує інтерфейс `PipeTransform` з методом `transform(value, metadata)`: приймає вхідні дані (`req.body`, `req.params`, `req.query`), може змінити чи провалідувати їх, повертає перетворене значення, або кидає помилку, якщо дані некоректні. **Ключове:** найпоширеніший приклад - вбудований `ValidationPipe`, що працює з `class-validator`/`class-transformer` для валідації DTO; pipes застосовуються на рівні параметра, методу чи глобально й виконуються до виклику обробника контролера.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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` | | Валідація DTO | `ValidationPipe` | | Очищення даних (trim, lowercase) | Кастомний pipe | | Перевірка параметрів | Кастомний pipe (`CheckUuidPipe`, `ParseObjectIdPipe`) | | Перетворення вхідних даних | `TransformPipe`, `NormalizePipe` | ## 8. Підсумок > **Pipe** у NestJS - це механізм, який виконує: > > - *валідацію* вхідних даних, > - *перетворення* типів, > - *нормалізацію* даних до того, як вони потраплять у контролер. Пайпи: - Реалізують інтерфейс `PipeTransform`; - Працюють до виклику обробника; - Можуть бути **локальними**, **методовими** чи **глобальними**; - Часто застосовуються для DTO-валідації й типізації вхідних даних.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.