Validaciones con Framework NestJS

por - septiembre 22, 2020

Validaciones con Framework NestJS

NestJS Validator

Introducción

Cuando estamos construyendo Web API para nuestras aplicaciones, debemos garantizar que el cliente debe enviar los parámetros correctos y necesarios para que nuestra funcionalidad no se rompa o genere algún error en el proceso a realizar. Muchos frameworks actuales para aplicaciones Web tienen este módulo y como es de esperar, el Framework NestJS también nos facilita dicha validación.

Para este ejercicio tendremos como base el CRUD creado en está publicación (aquí), donde ya tenemos todo listo y configurado.

Manos a la obra

Lo primero que haremos es instalar unos paquetes necesarios para que el componente ValidationPipe nos facilite las validaciones en el framework. Dichos paquetes los instalamos de la siguiente manera:

yarn add class-validator class-transformer

Luego de haber instalado vamos a proceder a crear una clase CreateCourseDto, donde colocaremos las validaciones de nuestra API. Aquí nos centramos en la Post, que precisamente es para crear un curso que estamos siguiendo, y que para la creación es necesario el nombre (name) y el estado (state). Para crear nuestra clase podemos ejecutar la siguiente instrucción:

nest g cl course/CreateCourseDto

Nos crear el archivo en src/course/create-course-dto.ts con su respectivo spec. Luego debe quedar lo siguiente forma:

import { IsString, MaxLength, IsNotEmpty, IsEnum } from "class-validator";
import { State } from '../app.service';

export default class CreateCourseDto {

    @IsString()
    @MaxLength(20)
    @IsNotEmpty()
    name: string;

    @IsNotEmpty()
    @IsEnum(State)
    state: State;

}  

Nota: Pueden copiar y pegar el código, pero les recomiendo que al menos un atributo lo escriban para que vayan viendo las ayudas y descripciones de cada validación.

Básicamente creamos unos atributos a la clase y sobre cada uno de estos atributos le colocamos decoradores que son como tal las validaciones. Aquí la descripción de cada uno:

  • IsString: La entrada deber ser una cadena de caracteres.
  • MaxLength: La cadena de caracteres tiene un tamaño máximo de caracteres.
  • IsNotEmpty: El atributo es requerido, por lo tanto debe tener valores
  • IsEnum: El atributo debe corresponder al Enum especificado. En nuestro ejemplo, debe ser wait, progress y completed. 
Igualmente podemos conocer más validaciones o crear nuevas, partiendo de esta documentación class-validator.

Luego debemos ir al controlador src/app.controller.ts e importar está nueva clase y sustituir la interfaz del objeto course con la clase que estamos importando. Debe quedar como lo siguiente:

App Controller

Con esto ya tenemos las validaciones incluidas en nuestro método Post, lo que falta es habilitar en el proyecto el uso de validaciones. Para ello vamos al archivo src/main.ts y vamos a agregar al global el uso de ValidationPipe, que haremos de la siguiente manera:

Edición Main con ValidationPipe

Ahora podemos ejecutar nuestro proyecto y probar desde Postman con la siguiente instrucción:
yarn start:dev
Vamos a ir a postman y vamos a ejecutar el método Post de creación de curso, pero sin enviar algunos de nuestros parámetros requeridos.

Ejemplo Postman Validator Parte I

Chevere hasta ahí, pero si queremos aplicar mensajes personalizados, ya sea porque nuestra aplicación siempre va a estar en español, no es normal que nos retorne mensajes en ingles o simplemente los mensajes se requieren en un formato distinto. Entonces lo que haremos es editar el archivo src/course/create-course-dto.ts de la siguiente manera:
import { IsString, MaxLength, IsNotEmpty, IsEnum } from 'class-validator';
import { State } from '../app.service';

class CreateCourseDto {
  @IsString({
    message: messageProperty('debe ser una cadena de texto'),
  })
  @MaxLength(20, {
    message: messageProperty('debe ser máximo $constraint1 caracteres'),
  })
  @IsNotEmpty({
    message: messageProperty('es requerido'),
  })
  name: string;

  @IsNotEmpty({
    message: messageProperty('es requerido'),
  })
  @IsEnum(State, {
    message: messageProperty('no es válido'),
  })
  state: State;
}

function messageProperty(message: string): string {
  return `La propiedad $property ${message}`;
}

export default CreateCourseDto;    

Fíjense que el cambio que realice, además de colocar el export default al final, agregué una función que retorna por defecto el inicio de cada mensaje de error y un objeto json con la clave message dentro de cada decorador. Cabe destacar que los atributos $property y $constraint1 son propios de class-validator y cada uno trae el nombre de la propiedad validada y el o los valores de la regla respectivamente. Igualmente existe otra forma de obtener estos atributos, que nos puede permitir hacer lógica diferente para el tratamiento de los mensajes de salida.

Luego de lo anterior vamos a Postman y volvemos a hacer la petición para ver los cambios realizado en cuando a los mensajes de error.

Ejemplo Postman Validator Parte II

Conclusión

He aquí el final de este ejercicio, ya dejo a su disposición hacer la prueba con el método Put de actualización de un curso y probar otras maneras de personalizar los mensajes de error. No está demás comentar que en la documentación del Framework NestJS nos cuenta un poco más de como usar en el proyecto, que pueden revisar desde aquí. Sin más me despido, muchas gracias por llegar hasta aquí, espero sus comentarios, hasta pronto.

También te puede interesar

0 comentarios

ToTop