Al igual que todos los demás marcos, Mongoose proporciona una forma de validar los datos antes de guardarlos en una base de datos. La validación de datos es importante para asegurarse de que los datos "malos" no se conserven en su aplicación. Una ventaja de usar Mongoose al insertar datos en MongoDB es su soporte integrado para esquemas de datos y la validación automática de datos cuando se conservan. No obtendrías esto sin Mongoose. Los validadores de Mongoose son fáciles de configurar. Al definir el esquema, un desarrollador puede agregar opciones adicionales a la propiedad que deben validarse. Veamos ahora algunos ejemplos básicos de validación en Mongoose.


Empezar con required

En este momento tenemos un esquema en Mongoose que no tiene validación. En otras palabras, todas las propiedades definidas a continuación son opcionales. Si proporciona cada propiedad al crear un documento, ¡excelente! Si no, ¡eso también es genial!

Por supuesto, casi siempre es necesario validar cualquier dato que desee conservar. Podemos modificar el esquema para agregar validación como tal. En el fragmento a continuación, estamos haciendo que titleel juego sea obligatorio. Ya no es opcional. Podemos hacer esto con la requiredpropiedad.

Con nuestra validación para el título del juego, intentemos guardar un juego en la base de datos sin especificar un título.

Podemos ejecutar index.js usando node index.jsen la terminal para probar esto.

mongo-crud $ node index.js
(nodo: 10176) UnhandledPromiseRejectionWarning: Rechazo de promesa no manejado 
(ID de rechazo: 2): ValidationError: Falló la validación del juego: título: Ruta title 
es requerido. (nodo: 10176) [DEP0018] DeprecationWarning: Rechazos de promesa no gestionados
están en desuso. En el futuro, los rechazos de promesas que no se manejan
Termine el proceso de Node.js con un código de salida distinto de cero.

Interesante. Obtenemos mucha información de error sobre el rechazo de una promesa no manejada. Podemos solucionar esto actualizando nuestra lógica en la saveGame()función. Sin embargo, lo bueno es que dentro de la información enumerada vemos que la validación funcionó ya que la validación del juego falló: title: Path titleis required nos lo indica. Actualicemos el código para manejar la promesa correctamente implementando un bloque try / catch.

Ejecutar el archivo index.js ahora nos da un mensaje más fácil de leer.

mongo-crud $ node index.js
Falló la validación del juego: título: titlese requiere la ruta .

¡Excelente! La validación está funcionando. Es importante señalar que este ejemplo de validación en Mongoose es solo eso, validación en Mongoose. Esto no tiene nada que ver con la validación de datos a nivel de base de datos o MongoDb. Otra cosa a tener en cuenta es que este tipo de validación en Mongoose es complementario a un paquete de validación como Joi que usamos en el tutorial de la API de node restAl usar tanto la validación en la capa REST como la capa Mongoose, puede asegurarse de que los documentos defectuosos no se conserven en la base de datos.


Más sobre validadores integrados

En la sección anterior, vimos cómo usar la requiredpropiedad para que sea obligatorio que un usuario proporcione el título de un juego cuando persiste en la base de datos. También puede usar una función con requiredpara requerir algo condicionalmente. En el fragmento a continuación, decimos que si el juego está en oferta, se requiere el precio.

Ahora podemos intentar guardar un juego, pero omitiremos el título y el precio para ver si nuestras reglas de validación siguen funcionando. Nuestra lógica para insertar el juego está aquí.

La ejecución del programa muestra que estas reglas funcionan bien. Se requiere tanto el precio como el título, por lo que el juego no se conserva.

mongo-crud $ node index.js
Error de validación del juego: precio: pricese requiere la ruta ., Título: titlese requiere la ruta .

minlength y maxlength

Además de hacer necesaria una cadena, también puede especificar la longitud mínima y la longitud máxima que debería tener. Considere este esquema.

Ahora, proporcionemos un título, pero con solo 3 caracteres y veamos qué sucede.

Cuando ejecutamos el programa, el validador nos dice que nuestro título es demasiado corto.

mongo-crud $ node index.js
Error de validación del juego: precio: pricese requiere la ruta .,
title: Path title( Pac) es más corto que la longitud mínima permitida (4).

validación de enumeración

Al crear un juego, le estamos asignando algunas etiquetas. Usando la validación de enumeración, podemos especificar las etiquetas disponibles que se pueden usar. A continuación, decimos que las etiquetas de un juego deben ser deportes, carreras, acción o rpg.

Ahora intentamos guardar un juego usando una etiqueta que no hemos tenido en cuenta en la validación de enumeración, aventura.

Efectivamente, al intentar insertar ese juego en la base de datos falla y obtenemos el error que adventureno es un valor de enumeración válido para la ruta tags.

mongo-crud $ node index.js La validación del juego falló: tags.0: adventureno es un valor de enumeración válido para la ruta tags.

Validadores personalizados

También puede configurar un validador personalizado en Mongoose. Aquí modificaremos la validación de las etiquetas de modo que un usuario deba proporcionar más de una.

Ahora intentamos guardar un juego y solo proporcionamos una etiqueta.

Ejecutar el programa nos da el error de validación que esperamos.

mongo-crud $ node index.js
Error de validación del juego: etiquetas: debes proporcionar más de una etiqueta.

Validadores asíncronos

La validación asincrónica entra en juego cuando necesita obtener algunos datos remotos o realizar algún otro tipo de tarea asincrónica antes de persistir en la base de datos. Para esto podemos usar un validador asíncrono. Echemos un vistazo a uno. Simularemos el trabajo asincrónico con la función setTimeout ().

Para habilitar la validación asincrónica, todo lo que necesita hacer es agregar la propiedad isAsync al objeto de validación y establecerlo en trueLuego, puede realizar su trabajo asincrónico, ya sea para obtener datos remotos, leer desde el sistema de archivos o trabajar con una base de datos, y la validación seguirá funcionando correctamente.


Resumen de ejemplos de validación de Mongoose

En este tutorial sobre Validación de Mongoose, aprendimos que al definir un esquema, puede establecer el tipo de propiedad en un objeto SchemaType. Utilice este objeto para definir los requisitos de validación para la propiedad dada. Podemos agregar validación con código como este.

Mongoose ejecuta la lógica de validación antes de que se pueda guardar un documento en la base de datos. También es posible activarlo manualmente llamando al método validate (). Algunos de los validadores integrados incluyen:

  • Cuerdas: minlength , maxlengthmatch,enum
  • Números: min ,max
  • Fechas: min ,max
  • Todos los tipos: required

Para configurar la validación personalizada, puede configurar el objeto de validación y utilizar una función en la propiedad de validación.

Al hablar con una base de datos o un servicio remoto para realizar la validación, es necesario que utilice un validador asíncrono. Habilita esto con la isAsyncpropiedad establecida en true.

Algunas otras propiedades útiles de SchemaType incluyen:

  • Cuerdas: lowercase , uppercase,trim
  • Todos los tipos: get , set(para definir un captador de encargo / definidor)

¡Feliz validación!