Що таке Pipe?
1. Що таке Pipe в NestJS
Pipe - це клас, який реалізує інтерфейс
PipeTransformі має методtransform(value, metadata).
Пайпи:
- приймають вхідні дані (наприклад,
req.body,req.params,req.query); - можуть змінювати чи валідувати їх;
- повертають перетворене значення, яке потім отримує метод контролера;
- або кидають помилку, якщо дані некоректні.
Приклад простого pipe:
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()) | Для всього застосунку |
Приклад застосування на рівні параметра:
@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.
Приклад:
import { IsString, IsEmail, Length } from 'class-validator';
export class CreateUserDto {
@IsString()
@Length(3, 30)
name: string;
@IsEmail()
email: string;
}@Post()
createUser(@Body(new ValidationPipe()) dto: CreateUserDto) {
return this.userService.create(dto);
}Тепер Nest автоматично:
- Перетворює JSON із тіла запиту в екземпляр
CreateUserDto; - Перевірить поля через
class-validator; - Якщо валідація не пройдена - поверне
400 Bad Requestіз детальним описом помилок.
5. Приклад глобального ValidationPipe
Зазвичай вмикається один раз у main.ts:
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
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;
}
}Використання:
@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-валідації й типізації вхідних даних.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.