Categorias
iiiiii
DTO Data Trasfer Object
Descripcion
Validar los tipos de objetos que recibe Nest
Nota1
un DTO no es mas que una clase exportada para validar el tipo de objeto que espera recibir el backet.
se podria decri que es una interface pero esta si obliga en el backend a usar la estructura de los objetos
cumplan con esa estrucutra creada en el DTO.
Documentacion:https://www.npmjs.com/package/class-validator
1. se va hacer DTO en nest es necesario usar las siguientes librerias que crea y espone muchos pipes para usar
yarn add class-validator class-transformer
//IsOptional IsPositive IsMongoId
//IsArray IsString IsUUID
//IsDecimal IsDate IsDateString
//IsBoolean IsEmail IsUrl
2. se crea una clase(CreateCardDto) y se exporta
2.1 se le dice que estructura se debe seguir y que tipo de datos son y si son obligatorios
3. se aplica el decorador @UsePipes(ValidationPipe) en el metodo o clase "Tanbien se puede global" para decirle que va a validar la estrucutura que llegue
como parametro del tipo de clase que se le puso a la funcion "crarCarro"
4. enviar una peticion http de tipo post sin enviarle un parametro. SE RECIBITA UN ERROR sino tiene la estrucutra espesificada en el DTO
NOTA:
el uso del @UsePipes(ValidationPipe) se puede espesificar en diferentes partes. se puede usar en el controlador
para que todos los metodos que usen los DTO puedan realizar las validaciones.
Tambien se puede poner a nivel de aplicacion.
PONERLO GLOBALMENTE:
//ir a main.js
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
//Se hace uso de los pipes que se van usar en cualquier request
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, //Esto indica que va eliminar las propiedades que no lucen como las clases a las que deben ser semejantes
forbidNonWhitelisted: true, //Esto le dice las propiedades dentro del request tiene que venir exactamente iguales que las calses DTO
})
);
await app.listen(3000);
}
bootstrap();
Modulo
//Classe
import { IsString,IsOptional } from "class-validator";
export class CreateCardDto{
//la caracteriscas es que deben ser readonlu
//@IsString({message:'Mensaje personalziado'})
@IsString() //Se hace uso de los decoradores de paquete class-validator para espesificar cual es obligatorio strin etc
//@IsOptional() para hacerlo opcional
readonly brand:string; //cuando sean opcionales tambien seria conveniente ponerlas brand?: para que typescrip sepa que son opcionales
@IsString()
readonly model:string;
}
Controlador
import { Body, Controller, Post, ValidationPipe } from '@nestjs/common';
import { CarsService } from './cars.service';
import { CreateCardDto } from './dto/create-car.dto';
//@UsePipes(ValidationPipe) se puede poner aqui para que todos los metodos que usen DTO puedan manejar las validaciones
@Controller('cars')
export class CarsController {
constructor(
private readonly carsService:CarsService
){
}
@Post()
@UsePipes(ValidationPipe) //Aqui usamos el validator pipe que se usa para hacer la diferentes validaciones y hacer el DTO
crarCarro(@Body() createCardDto:CreateCardDto){
return {
createCardDto
}
}
}
Entity
import { Injectable, NotFoundException } from '@nestjs/common';
import { Car } from './interfaces/car.interface';
import {v4 as uuid} from 'uuid';
@Injectable()
export class CarsService {
private cars:Car[]=[
{
id:uuid(),
brand:'bran',
model:'Corolla'
},
{
id:uuid(),
brand:'Honda',
model:'Sid'
},
{
id:uuid(),
brand:'Jeep',
model:'Otra'
}
];
findAll(){
return this.cars;
}
findById(id:string){
const cart = this.cars.find(car=>car.id===id);
if(!cart) throw new NotFoundException(`el carro con el id=${id} no existe`); //Estos puede enviar el mensaje personalizado si asi se dese por parametro
return cart;
}
}
App.module
a
Main
a