Validación de MongoID con Pipes en NestJS
Clase 14 de 24 • Curso de NestJS: Persistencia de Datos con MongoDB
Contenido del curso
- 4

Configuración y ejecución de MongoDB con Docker Compose
08:51 - 5

Conexión a Base de Datos MongoDB con Mongo Compass
05:05 - 6

Instalación y conexión de MongoDB en Node con driver oficial
06:59 - 7

Inyección de Conexiones MongoDB en Servicios NestJS
06:57 - 8

Consultas a MongoDB con Nest.js: Implementación de Endpoints
04:46 - 9

Variables de Entorno para Configuración de MongoDB en Node.js
10:43
- 10

Instalación y Configuración de Mongoose con NestJS
07:52 - 11

Definición de Esquemas en Mongoose para eCommerce con NestJS
07:45 - 12

Operaciones CRUD con MongoDB y Node.js en un Servicio de Productos
09:29 - 13

Creación, actualización y eliminación de productos en MongoDB
10:12 - 14

Validación de MongoID con Pipes en NestJS
06:38 - 15

Paginación en MongoDB con DTOs y Validaciones en NestJS
11:13 - 16

Consultas Avanzadas con Rangos de Precios en MongoDB
07:30 - 17

Indexación en MongoDB: Cómo optimizar consultas rápidas
03:11
- 18

Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
07:55 - 19

Relaciones uno a uno referenciadas en MongoDB
12:20 - 20

Relaciones Uno a Muchos en MongoDB: Arrays Embebidos vs Referenciados
09:28 - 21
Tipado de Documentos Embebidos en NestJS con Mongoose
01:49 - 22

Relaciones Uno a Muchos Referenciadas en MongoDB
14:36 - 23

Manipulación de Arrays en E-commerce: Métodos y Endpoints
13:08
En ocasiones es necesario validar nuestros propios datos de entrada. Cuando esos datos sean utilizados para realizar consultas a una base de datos, es recomendable estar prevenido por posibles ataques y validarlos manualmente.
Cómo validar ID de MongoDB
Los documentos que se crean en una base de datos MongoDB, por defecto, utilizan una propiedad llamada _id, o también llamado ObjectID, que representa el ID principal de cada documento. El mismo tiene un formato particular de 12 o 24 caracteres que podemos validar para asegurar que, el dato que el front-end nos envía, se trata efectivamente de un Mongo ID.
Paso 1: creamos el Pipe de NestJS
Crearemos un custom pipe con el comando nest g pi mongoId para validar el Mongo ID. El mismo contendrá la lógica del validador.
import { ArgumentMetadata, Injectable, PipeTransform, BadRequestException } from '@nestjs/common';
import { isMongoId } from 'class-validator';
@Injectable()
export class MongoIdPipe implements PipeTransform {
transform(value: string, metadata: ArgumentMetadata) {
if (!isMongoId(value)) {
throw new BadRequestException(`${value} is not a mongoId`);
}
return value;
}
}
Afortunadamente, la dependencia class-validator nos ayudará a validar el formato del string de entrada para verificar si posee la forma de un Mongo ID.
Paso 2: implementar el validador
Implementar un Pipe en NestJS es muy sencillo, basta con pasarlo como parámetro al decorador para que el mismo se ocupe de validar el dato de entrada.
import { MongoIdPipe } from './mongo-id.pipe';
export class ProductsController {
@Get(':productId')
getOne(@Param('productId', MongoIdPipe) productId: string) {
return this.productsService.findOne(productId);
}
}
Recuerda prestar atención tanto al tipado de datos para evitar errores como la validación de los mismos para mejorar la seguridad de tu aplicación. Las aplicaciones profesionales deben desarrollarse con las mejores prácticas posibles.
Contribución creada por: Kevin Fiorentino.
Código de ejemplo de pipe para mongoid
nest g pi common/mongoId
// src/common/mongo-id.pipe.ts
import {
ArgumentMetadata,
Injectable,
PipeTransform,
BadRequestException,
} from '@nestjs/common';
import { isMongoId } from 'class-validator';
@Injectable()
export class MongoIdPipe implements PipeTransform { // 👈 new pipe
transform(value: string, metadata: ArgumentMetadata) {
if (!isMongoId(value)) {
throw new BadRequestException(`${value} is not a mongoId`);
}
return value;
}
}
// src/products/controllers/products.controller.ts
import { MongoIdPipe } from './../../common/mongo-id.pipe'; // 👈 import
...
export class ProductsController {
@Get(':productId')
getOne(@Param('productId', MongoIdPipe) productId: string) { // 👈 use MongoIdPipe
return this.productsService.findOne(productId);
}
}