Pipes existentes en Nest y cómo usarlos
Los pipes en NestJS son clases que implementan la interfaz PipeTransform y se ejecutan antes de que los datos lleguen al controlador. Su función principal es transformar los datos de entrada o validar que cumplan con ciertos criterios antes de procesarlos.
NestJS incluye varios pipes integrados que cubren las necesidades más comunes de validación y transformación. Estos pipes se pueden aplicar a nivel de parámetro, método o controlador, proporcionando flexibilidad en su implementación.
Pipes de validación integrados
ValidationPipe es el pipe más utilizado para validar objetos complejos usando decoradores de class-validator. Este pipe transforma automáticamente los objetos planos en instancias de clase y aplica las reglas de validación definidas:
import { Body, Controller, Post, UsePipes, ValidationPipe } from '@nestjs/common';
import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
class CreateUserDto {
@IsNotEmpty()
name: string;
@IsEmail()
email: string;
@MinLength(6)
password: string;
}
@Controller('users')
export class UsersController {
@Post()
@UsePipes(new ValidationPipe())
create(@Body() createUserDto: CreateUserDto) {
return `Usuario creado: ${createUserDto.name}`;
}
}
ParseIntPipe convierte strings en números enteros y valida que la conversión sea exitosa. Es especialmente útil para parámetros de ruta que deben ser numéricos:
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return `Usuario con ID: ${id}`;
}
}
ParseBoolPipe transforma strings como "true" o "false" en valores booleanos reales:
import { Controller, Get, Query, ParseBoolPipe } from '@nestjs/common';
@Controller('products')
export class ProductsController {
@Get()
findAll(@Query('active', ParseBoolPipe) active: boolean) {
return `Productos activos: ${active}`;
}
}
Pipes de transformación de datos
ParseArrayPipe convierte strings separados por comas en arrays y puede aplicar transformaciones adicionales a cada elemento:
import { Controller, Get, Query, ParseArrayPipe } from '@nestjs/common';
@Controller('products')
export class ProductsController {
@Get()
findByIds(
@Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
ids: number[]
) {
return `Buscando productos: ${ids.join(', ')}`;
}
}
ParseUUIDPipe valida que un string tenga formato UUID válido y puede especificar la versión requerida:
import { Controller, Get, Param, ParseUUIDPipe } from '@nestjs/common';
@Controller('orders')
export class OrdersController {
@Get(':id')
findOne(@Param('id', new ParseUUIDPipe({ version: '4' })) id: string) {
return `Pedido con UUID: ${id}`;
}
}
ParseEnumPipe valida que un valor pertenezca a un enum específico:
import { Controller, Get, Query, ParseEnumPipe } from '@nestjs/common';
enum OrderStatus {
PENDING = 'pending',
COMPLETED = 'completed',
CANCELLED = 'cancelled'
}
@Controller('orders')
export class OrdersController {
@Get()
findByStatus(
@Query('status', new ParseEnumPipe(OrderStatus))
status: OrderStatus
) {
return `Pedidos con estado: ${status}`;
}
}
Aplicación de pipes a diferentes niveles
Los pipes se pueden aplicar de múltiples formas según el alcance deseado. A nivel de parámetro, el pipe solo afecta a ese parámetro específico:
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return `Usuario: ${id}`;
}
A nivel de método, el pipe se aplica a todos los parámetros del método:
@Get(':id')
@UsePipes(ValidationPipe)
findOne(@Param('id') id: string, @Body() updateDto: UpdateUserDto) {
return 'Método con pipe aplicado';
}
A nivel de controlador, el pipe afecta a todos los métodos del controlador:
@Controller('users')
@UsePipes(new ValidationPipe({ whitelist: true }))
export class UsersController {
// Todos los métodos heredan el ValidationPipe
}
Configuración avanzada de pipes
Los pipes integrados aceptan opciones de configuración que modifican su comportamiento. El ValidationPipe, por ejemplo, puede configurarse para eliminar propiedades no definidas en el DTO:
@Post()
@UsePipes(new ValidationPipe({
whitelist: true, // Elimina propiedades no definidas en el DTO
forbidNonWhitelisted: true, // Lanza error si hay propiedades extra
transform: true // Transforma tipos automáticamente
}))
create(@Body() createUserDto: CreateUserDto) {
return 'Usuario creado con validación estricta';
}
Para manejo de errores personalizado, los pipes pueden configurarse con mensajes específicos:
@Get(':id')
findOne(
@Param('id', new ParseIntPipe({
errorHttpStatusCode: HttpStatus.NOT_ACCEPTABLE
}))
id: number
) {
return `Usuario: ${id}`;
}
Los pipes también pueden combinarse para aplicar múltiples transformaciones y validaciones en secuencia:
@Get(':id')
findOne(
@Param('id', ParseIntPipe, new DefaultValuePipe(1))
id: number
) {
return `Usuario: ${id}`;
}
Esta flexibilidad permite crear flujos de validación robustos que garantizan que los datos lleguen al controlador en el formato correcto y cumpliendo todas las reglas de negocio establecidas.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en Nest
Documentación oficial de Nest
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Nest es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Nest
Explora más contenido relacionado con Nest y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
Comprender qué son los pipes en NestJS y su función principal. Aprender a utilizar los pipes integrados para validación y transformación de datos. Aplicar pipes a diferentes niveles: parámetro, método y controlador. Configurar opciones avanzadas de los pipes para personalizar su comportamiento. Combinar múltiples pipes para crear flujos de validación robustos.
Cursos que incluyen esta lección
Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje