Transcripciones
1. Introducción: Bienvenido de nuevo al curso
Express JS, Módulo siete, Validación Mangus Esta clase es una continuación de la serie de cursos Express JS. Mi nombre es Shawn Raganhi y estoy emocionado de
guiarte a través de este módulo donde llevamos tus habilidades de espalda
y desarrollo al siguiente nivel
dominando
la validación En este módulo, nos
centraremos en la validación, un aspecto crucial de cualquier sistema backend
robot Aprenderás a implementar la validación en mangos para
asegurar la integridad de los datos Luego aprenderá a utilizar validadores
integrados para una aplicación rápida y efectiva de
restricciones, luego creará validadores personalizados adaptados a las necesidades específicas de la
aplicación Después de eso,
aprenderá a manejar
y responder a los errores de validación con gracia,
y finalmente, personalizar las opciones de
esquema para una mayor flexibilidad
y Este módulo es un
cambio de juego para los desarrolladores que
buscan crear aplicaciones confiables
y escalables Al dominar la validación de
Mongoose, escribirá un código libre de
errores más limpio, reducirá los errores y se asegurará de que sus datos siempre
sean consistentes y confiables Estas son algunas de
las habilidades esenciales para construir APIs listas para
la producción. En este módulo como proyecto, seguiremos construyendo
la aplicación Fair Wheels. Primero, mejorará la API de la compañía
reemplazando la
matriz en memoria con Mongo DB Luego creará
un APA de nuevo cliente, completo con
operaciones completas de multitudes y validación. Este proyecto práctico
solidificará su comprensión integrar la validación
de
Mongoose en aplicaciones del mundo real Este módulo está
repleto de valiosas técnicas y experiencia práctica para
ayudarte a construir mejores backends Así que vamos a sumergirnos y
hacer brillar tus habilidades. Nos vemos en la primera conferencia.
2. Implementa la validación en Mongoose: I Entonces este es el esquema central que definimos
anteriormente en la sección. Ahora por defecto, todas
estas propiedades que aquí definimos,
son opcionales. Entonces, si creo un curso y dejo fuera todas
estas propiedades, entonces guardo el monedero
en la base de datos, esa será operación perfectamente
válida. Mongo DV no le
importa que tengamos un curso que no tenga nombre o que no tenga precio Wen esta conferencia,
te
voy a mostrar cómo implementar la validación. Ahora para esta demo, sólo
voy a hablar del validador
requerido Pero tenemos más
validadores incorporados de los que
vas a conocer
en la próxima conferencia Entonces hagamos que este
nombre sea requerido. Primero, reemplazamos la
cadena con un objeto aquí. Ponemos el tipo a string, y luego establecemos required, true. Con esto, si creo un curso sin nombre, así que
entremos en esto. En su momento intento guardar
este curso en la base de datos, voy a obtener una
excepción. Déjame mostrarte. Entonces primero,
volvamos al final de este archivo y eliminemos,
eliminemos curso. Ahora entra haz, crea curso. Ahora de vuelta en la terminal,
ejecutemos la aplicación. Bien. Mira lo que tenemos. Obtuvimos este error de variación. Si ves ese error, eso básicamente
significa que
no has manejado ese rechazo. Entonces solo para refrescar tu memoria, recuerda, las promesas pueden
estar en tres estados. Inicialmente, están pendientes, luego pueden ser
cumplidos o rechazados. En este caso, tenemos
una promesa rechazada. Entonces no lo hemos
manejado adecuadamente. Así que de vuelta en el código aquí, al guardar este curso
en la base de datos, mira, el método save
devuelve una promesa. Estamos esperando ahí
para obtener el resultado. Entonces con esta implementación, sólo
estamos asumiendo
el escenario de éxito. Si se rechaza la promesa, no
tenemos ningún
código para manejar eso. Entonces antes,
te dije que deberías poner este código en
un bloque de caché tr. Entonces movamos esto aquí. Agrega el bloque de caché aquí, obtenemos una excepción, y luego podemos mostrar el
mensaje de excepción en el canso Ahora, de vuelta a la terminal, ejecutemos la aplicación
una vez más. Así que ya no nos
avisamos. En cambio, obtenemos
este mensaje de error. Fallo de validación de Forse, se requiere el nombre de
ruta. Entonces, si tenemos un objeto de curso
no válido, Mongoose no nos permite
guardar el curso a través de la base Así que la validación entra
automáticamente en
el momento en que tratamos de guardar un
curso a través de la base También podemos
activar manualmente la validación. Permítanme comentar
estas dos líneas. Este objeto de curso tiene
un método de validación. Ahora bien este método de validar, mira, devuelve una promesa de vacío, para que podamos esperarlo. Y si nuestro curso no es válido, entonces obtendremos una excepción, y terminaremos
en este bloque de caché. Así que volvamos al índice del nodo
terminal que tiene, mira, tenemos el mismo error de
validación. Se requiere el nombre de ruta. Ahora bien, una cosa que
personalmente no me gusta del
diseño de mangosta es que este método varidate
conserva una promesa de vacío Entonces aquí no
tenemos ningún resultado. Idalmente, este método de validación
debería devolver un booleano. Entonces podríamos llamar a esto es válido. Y entonces si el
curso no es válido, aquí
podríamos tener alguna lógica. Entonces esto es un
defecto de diseño y mangosta. Devuelve una promesa de vacío. Ahora, la única opción
para obtener ese tipo de booleano es pasar
una devolución de llamada aquí Entonces, en lugar
de esperar la promesa, tenemos que volver al enfoque del pase de
devolución Entonces aquí pasamos una función
que toma un objeto de error, y luego podemos verificar
si tenemos algún error. Entonces podemos ejecutar alguna lógica. Ahora podrías preguntar, ya
tenemos aquí este bloque de caché. Entonces, si tenemos algún error de
validación, podemos ejecutar ese
tipo de lógica aquí. Eso es cierto, pero escribir código así es un
poco desordenado Entonces espero que
en algún momento del futuro, el equipo de
Mongo cambie este
método a Dana Ahora que a un lado, movamos este código y volvamos
a nuestro código original. Una cosa que necesito
aclarar aquí es que esta validación que
implementamos en la propiedad name solo
tiene sentido en mongoos A Mongo DB no le
importa esta propiedad con nombre. Entonces, si hemos trabajado
con bases de datos como SQL Server o MySQL, ya
sabes que en
estas bases de datos, podemos definir la validación
a nivel de base de datos. Por ejemplo, en
nuestra tabla de cursos, vamos a
tener una columna de nombre y podemos marcar esa
columna como requerida. Con eso, no podemos almacenar un curso sin el
nombre en nuestra base de datos. En Mongo DB, no tenemos eso. A Mongo Dew no le
importa ninguna de estas cosas. Entonces esta validación
que hemos implementado aquí sólo tiene
sentido en los mongoos En el momento en que tratamos de
salvar un curso, mangosta ejecuta la lógica de
validación Y si el curso no es válido, no
lo guardará en
la base de datos. Ahora, una última cosa que necesito
aclarar aquí antes de
terminar esta conferencia. Anteriormente en la sección
sobre Express, les
presenté un paquete de
nada llamado Joy Entonces podrías estar preguntando cuándo tenemos dos tipos de validación. ¿Deberíamos usar Joy o
deberíamos usar mangosta como validación? La respuesta es ambas. Este tipo de validaciones se
complementan entre sí. Así que usamos la alegría en
nuestras APIs de descanso. Utilizamos eso como primer
ataque para asegurarnos los datos que nos está
enviando el cliente sean datos válidos. Pero aún necesitamos este
tipo de validación en mangos para asegurarnos de
que los datos que
guardamos en la base de datos estén en
la forma correcta porque es posible que el cliente
nos envíe un curso válido en el
cuerpo de la solicitud Pero cuando creamos un
objeto de curso en nuestro servicio SDDP, quizás nos olvidamos de establecer la propiedad name a lo que
obtenemos de request
dot body dot name Entonces, al hacer cumplir la
validación en mangos, podemos asegurarnos de que
errores de programación como este no den como
resultado que
los documentos no válidos sean
persistidos en una base de datos
Mongo A continuación, vamos
a ver los errores válidos
incorporados en los mangos
3. Uso de validadores Mongoose integrados: En la última conferencia, aprendimos sobre este validador requerido, que es uno de los validadores incorporados
en mangos En esta conferencia,
vamos a echar
un vistazo más de cerca a estos validadores
incorporados Entonces esta propiedad requerida aquí, podemos establecer eso en un booleano o una función que
devuelve
un Y esto es útil
cuando quieres hacer condicionalmente tu
propiedad requerida o no Por ejemplo,
imaginemos que el precio
solo se requiere si se publica el
curso. Agreguemos aquí el
validador requerido. Primero, reemplazamos
el número por un objeto. Establezca el tipo aquí de
nuevo en número. Y luego establecer requerido. Aquí, necesitamos
pasar una función. Así funcionan. Y
en esta función, devolvemos un booleano Por lo que devolvemos esto para hacer referencia a este curso objeto
punto se publica. Entonces, si se publica es cierto, entonces se requerirá precio. Bien. Ahora aquí, necesito
aclarar algo. En este
caso particular, no podemos reemplazar esta función
con una función de flecha. Es decir, si hacemos esto, nuestro validador
no funcionará porque las funciones de
flecha no
tienen su propio esto Utilizan este valor del contexto de ejecución
adjunto. En este caso particular,
hay una función en
algún lugar de mangosta que va a llamar a esta función Esta referencia que tenemos aquí
hará referencia a esa función, no al objeto del curso que
estamos tratando aquí. Así que tenemos que revertir esto de
nuevo a una función regular. Ahora, vamos a probar esta validación. Así que aquí está nuestro objeto de curso. Voy a quitar el precio, y se puede ver que el
curso está publicado. Entonces deberíamos obtener dos errores
de validación. Ahora, de vuelta a la terminal, ejecutemos la aplicación. Mira, se
requiere el precio de la ruta y también
se requiere el nombre de la ruta. Ahora después, te
mostraré cómo obtener mensajes de error
individuales
de esta excepción. Por ahora, apenas estamos recibiendo el mensaje como una simple cadena. Entonces este es nuestro validador
requerido. Podemos establecer eso a
un booleano simple o una función para
hacer condicionalmente una Ahora, dependiendo del tipo
de propiedades que tengamos aquí, tenemos validadores adicionales
incorporados Por ejemplo, con cuerdas, también
tenemos Longitud mínima y longitud
máxima. Déjame mostrarte. Voy a descomponer esto. Aquí agregamos longitud mínima. Digamos que queremos
asegurarnos de que al menos tenemos
cinco caracteres. Aquí también podemos establecer la longitud máxima. Digamos 255 caracteres. También tenemos MT, y aquí podemos pasar
una expresión regular. Ahora bien,
en este caso particular no tiene sentido aplicar una expresión regular en
el nombre de un curso. Entonces voy a
encomiar esto. Otro validador útil que
tenemos para cadenas es Enum. Voy a crear
otra propiedad aquí. Llamemos a esa categoría. Y establece la cadena tipo dos. Ahora aquí, podemos usar
el validador Enum. Ponemos esto en una matriz
de cadenas válidas. Digamos que tenemos algunas categorías
predefinidas, red móvil
web, etc. Entonces a la hora de crear un curso, la categoría que establecemos debe
ser uno de estos valores. De lo contrario, vamos a
obtener un error de validación. Entonces déjame hacer esto requerido. Ahora volvamos a nuestro objeto curso. Vamos a agregar la categoría, y voy a configurar
esto para que simplemente adjunte. Ahora vamos a traer de
vuelta el nombre así como el precio. Por lo que sólo podemos ver el
error de validación para la categoría. Así que de vuelta en el
nodo terminal, indexado o persecución,
mira, categoría no es un valor de enum válido
para la categoría path Entonces estos son los validadores
específicos de cadenas. Tenemos Min Land, longitud máxima, coincidencia para usar una
expresión regular, y num. Para números,
tenemos min y max. Entonces aquí, el precio es un número. Podemos establecer un mínimo de
$10 y un máximo de $200. Y también tenemos estos
dos validadores para fechas. En la siguiente conferencia,
vas
a aprender sobre validadores
personalizados
4. Crea validadores personalizados en Mongoose: A veces los validadores incorporados
en mango no nos dan el
tipo de validación que necesitamos Por ejemplo, mira
esta propiedad tags. Nuestra etiqueta es una matriz de cadenas. ¿Y si queremos hacer
cumplir esta regla que cada núcleo debe
tener al menos una etiqueta? No podemos usar el validador
requerido porque con required, simplemente
podemos pasar
una matriz vacía, y eso será perfectamente válido para el punto de vista de Mangus Entonces aquí necesitamos un validador
personalizado. Entonces primero, necesitamos
reemplazar esto con un objeto para reemplazar
esto por un objeto. Aquí establecemos el tipo a array. Ahora necesitamos definir
un validador personalizado. Entonces aquí establecemos la
propiedad válida a un objeto. En este objeto, tenemos una
propiedad llamada validador, que establecemos en una función Esta función toma un argumento, que es la abreviatura de valor. Y aquí podemos implementar
nuestra lógica de validación personalizada. Para que podamos devolver
algo como esto. Si Galeno es mayor a cero, entonces esta propiedad
será válida También podemos establecer un mensaje
personalizado aquí. Entonces este objeto válido tiene otra propiedad
que es message. Entonces mensaje, nosotros lo pusimos también. Un núcleo debe tener
al menos una etiqueta. Ahora, vamos a probar esto. Así que de vuelta en nuestro
objeto curso, primero, voy a establecer categoría
a un valor válido, entonces web, luego voy
a pasar una matriz mt. Así que de vuelta en el
nodo terminal, indexado o tiene. Bien, mira, un núcleo
debería tener al menos una excavación. ¿Y si excluimos esta
propiedad así? Veamos qué pasa. Una vez más, nos llega
el mismo mensaje. Un núcleo debe tener
al menos una excavación. Entonces, si no establecemos esta propiedad porque definimos su
tipo como una matriz, mangosta inicializará
esto a una matriz vacía Ahora bien, ¿y si
ponemos esto en nulo? Así que ahora de vuelta en la terminal. Bien, mira, no se puede leer la longitud de la
propiedad de nub. Este no es el tipo de mensaje de validación que
queremos recibir. Entonces necesitamos modificar nuestra lógica de validación a
algo como esto. Si nosotros como valor y la propiedad de longitud
es mayor a cero, y esta propiedad será válida. Así que de vuelta en la terminal,
vamos a correr esto una vez más. Un núcleo debe tener
al menos una etiqueta, hermosa. Entonces así es como se define
un validador personalizado. Se establece la
propiedad validate en un objeto. En este objeto, agrega
esta función de validador, y de manera óptima,
puede establecer un mensaje
5. Manejo de errores de validación en Mongoose: Hasta el momento, solo hemos mostrado un mensaje sencillo sobre
nuestro error de validación. En esta conferencia, vamos a examinar este
objeto de error con más detalle. Entonces esta excepción que obtenemos en el bloque de caché tiene una
propiedad llamada errores. En este objeto, tenemos
una propiedad separada para
cada propiedad no válida
en nuestro objeto de curso. Déjame mostrarte a lo que me refiero. Así que de vuelta en nuestro objeto curso, aquí están las
propiedades de los puertos. Ahora mismo, aquí tenemos una propiedad
no válida que es tag. Hagamos también de categoría
una propiedad no válida. Voy a poner esto en un guión. Ahora con este
objeto de errores que obtendremos
tendrá dos propiedades. Uno es etiquetas, el
otro es categoría. ¿Bien? Así podemos iterar
para todas las propiedades en este objeto de error y obtener más detalles sobre
cada error de validación Entonces para campo en
error que errores, aquí hacemos un registro de consola. Vamos a R t errores, encontramos esa propiedad,
obtenemos su valor. Ahora bien, este es un objeto
de error de validación. Echemos un vistazo. Así que de vuelta en el nodo
terminal punto índice Js, así que déjame desplazarme hacia arriba y ver
qué está pasando aquí. Todo bien. Así que mira aquí, tenemos un objeto de
error de validación. Este es el mensaje. Debajo de eso, tenemos el rastro de pila, ¿de acuerdo? Ahora, todo eso a un lado, estas son las propiedades que
tenemos en la opción de
error de validación. Entonces aquí tenemos una propiedad
llamada propiedades, que nos da información sobre los requisitos de validación
para esta propiedad. Entonces aquí tenemos acceso a
nuestra función validador. Se puede ver el tipo de
este validador es Enum. Estos son los
valores de enumeración válidos para esta propiedad. A determina el nombre
de nuestra propiedad, en este caso, categoría, y el valor es el valor actual. Entonces nuestro objeto de error de validación tiene propiedades y
algunas otras propiedades. Uno es tipo, que
se establece en Enum, y esto es básicamente un
atajo al tipo de propiedades También tenemos otra ruta de propiedad
corta, que se establece en
categoría y valor, que es el
valor actual para esta propiedad. Así que aquí estamos iterando sobre estos objetos de
error de validación Y aquí tenemos múltiples errores
de validación. Entonces esta es la primera. Y debajo de eso, mira, tenemos otro objeto de error de
validación. Esto es para un núcleo debe
tener al menos una etiqueta. Entonces si te desplazas hacia
abajo, puedes ver el tipo de este error de
validación es definido por
el usuario porque aquí
tenemos un validador personalizado La ruta son etiquetas, el valor
actual es nulo. Entonces, si desea obtener el mensaje de error de
validación para cada propiedad no válida, simplemente
podemos acceder a
esta propiedad de mensaje. Ahora, de vuelta a la terminal, volvamos a ejecutar la aplicación. Entonces tenemos dos mensajes de
error de validación. Dash no es un
valor de enumeración válido para la categoría de ruta, y aquí está el segundo error de
validación para nuestra propiedad de texto
6. Opciones de tipo de esquema y personalización en Mongoose: Entonces, al definir un esquema, has aprendido que
podemos establecer el tipo de una propiedad directamente aquí o
usar un objeto de tipo esquema. Ahora bien, este objeto
tiene algunas propiedades. Has aprendido
de algunas de ellas. Conoces el tipo propiedad, conoces la
enumeración requerida, y así sucesivamente En esta conferencia,
vamos a
ver algunas
propiedades más útiles que están disponibles en estos objetos de tipo
chema Entonces, para las cadenas, tenemos tres propiedades adicionales
que puedes usar. Tenemos minúsculas. Podemos establecer eso en verdad. Y con esto, mangosta
convertirá automáticamente el valor de esta propiedad de
categoría a minúsculas Déjame mostrarte cómo funciona eso. De vuelta en nuestro curso objeto. Bien, primero, voy a
eliminar este error de validación. Entonces cambiemos de
categoría a web y notemos que aquí estoy usando
una W mayúscula, ¿verdad? Voy a establecer
etiquetas a, digamos, nt en ahora de vuelta aquí en los terminales
de la aplicación. Bien, creamos un objeto de curso y lo guardamos en la base de datos. Ahora mira la categoría. Es web minúscula. Y si miras brújula, vamos a refrescar esta lista. Entonces aquí está nuestro nuevo documento. La categoría se establece en
una web en minúscula. Entonces así es como funciona la propiedad en
minúsculas. También tenemos mayúsculas. Nuevamente, podemos establecer eso en verdad. Ahora, técnicamente, deberíamos usar uno de estos,
no los dos. Y por último, tenemos trim. Entonces, si tenemos remates
alrededor de nuestra cuerda, mangosta
eliminará automáticamente esos remates Por lo que estas tres propiedades están disponibles cuando se usan cadenas. Ahora tenemos un par
de propiedades más en el objeto de tipo de esquema, y estas propiedades se
pueden usar al definir cualquier propiedad
independientemente de su tipo. Por ejemplo, volvamos
a nuestra propiedad de precio. Digamos que siempre queremos
redondear el valor del precio, así podemos definir un
getter personalizado y un setter personalizado Así que llegar aquí pasamos una función de flecha que toma
V o valor como argumento. Ahora podemos definir nuestra
lógica personalizada o obtener este valor, así podemos aplicar matemáticas punto
redondo alrededor de este valor. Ahora podemos
definir de manera similar un conjunto personalizado. Y aquí pasamos una función
similar. Así que vamos a matemáticas punto redondo de. Entonces cada vez que establecemos
la propiedad price, se
llamará al conjunto de función, y aquí
redondearemos ese valor. Entonces con esto, si volvemos a nuestro objeto curso y
fijamos el precio en 15.8, veamos qué pasa Así que de vuelta en la terminal, volvamos a
ejecutar la aplicación. Mira, creamos un
nuevo objeto grueso, y el precio se establece en 16. Así que aquí, cuando establecemos este valor se llamó a nuestro
setter personalizado Y aquí redondeamos este valor. Ahora de vuelta en Compass, aquí está nuestro último documento del curso. Se puede ver que el
precio está establecido en 16. Ahora vamos a editar esto. Se puede ver que el tipo de
esta propiedad se establece Int 32, que es un entero. Voy a cambiar esto a doble y luego cambiar
el valor 16-15 0.8 Y por último, haz clic en Actualizar
para comprometer mis cambios. Entonces aquí, estoy simulando
un escenario donde tenemos un documento que estaba almacenado en la base de datos antes de
implementar esta lógica de redondeo En este caso, si lees estos cursos y luego
accedes a la propiedad price, se
llamará a
nuestro getter personalizado Y aquí,
redondearemos ese valor. Déjame mostrarte cómo funciona eso. Volvamos a nuestra función
get courses. Anteriormente, implementamos
esta lógica de paginación en la demo. No necesitamos eso. Entonces voy a comentar
estas dos líneas, y luego voy a cambiar el objeto query para que podamos
leer el curso en particular. Entonces queremos obtener
el curso con ID establecido para copiar el valor
de ese ID del curso. Así que de vuelta en Compass,
aquí está nuestro ID de curso. Copia esto y pegarlo aquí. Aquí, vamos a obtener un curso para que podamos acceder al primer
elemento de esta matriz. Ahora bien, si lee el
precio de la propiedad, verá que se
redondeará el valor de esta propiedad. Entonces aquí, vamos a leer
el precio de la propiedad. Vamos a entrar en este
curso de creación y llamar a obtener cursos. De vuelta en terminal.
Ejecutemos la aplicación. Bien, mira, el precio es 16, aunque en la base de datos, lo
almacenamos como 15.8 Así es como funcionan estos
getters y setters personalizados. Se llama al setter cuando
establecemos el valor de una
propiedad como aquí, y se llama al getter cuando leemos el
valor de una
7. Reestructuración de nuestro proyecto FareWheels: Todo bien. Así que aquí está nuestra aplicación
justa de ruedas. Ahora bien, si miras
el módulo del cliente, puedes ver aquí en la parte superior, estamos definiendo este modelo de
cliente. Y por debajo de eso, tenemos
nuestros manejadores de ruta. Entonces después de todos estos manejadores de
ruta, tenemos esta función de validar
cliente Entonces esta es una aplicación bastante
simple. Y en este módulo,
tenemos 85 líneas de código. Si nos fijamos en la definición del objeto
del cliente o
del modelo del cliente, este no es un modelo grande y complejo. En una aplicación del mundo real, nuestro modelo de cliente
va a ser más complejo. Entonces el código en este
módulo va a crecer, y eso es algo que debemos
abordar en esta conferencia. Para mantener nuestras aplicaciones
mantenidas, debemos asegurarnos de
que cada módulo sea responsable de una
sola cosa Ese es el
principio de responsabilidad única en la práctica. En esta aplicación,
este módulo de cliente que tenemos forma parte
de la carpeta rutas. Entonces, técnicamente, todo lo que
deberíamos tener en este módulo es una definición
de la ruta de nuestro cliente. La definición de
un objeto cliente no pertenece realmente
a este módulo. Entonces en esta conferencia,
vamos a extraer este código y
ponerlo en otro lugar. Así que he creado
esta carpeta de modelos. En esta carpeta, vamos a tener módulos como clientes Perros, perros compañía, y así sucesivamente. Así que agreguemos un nuevo
filer, customer dot js. Ahora de vuelta en los clientes punto JS, voy a mover
la definición
del modelo de cliente
dentro de nuestro nuevo modelo. Así que vamos a mover eso aquí. Ahora aquí, tenemos una
dependencia a los mangos. Así que volvamos
aquí arriba. Esta es la línea
para cargar mangos. También necesitamos cargar I, como verán en un segundo. Ahora de vuelta en nuestro módulo de
clientes, también
voy a
mover la función para validar a un cliente
dentro de nuestro nuevo módulo Entonces y pegarlo aquí al final. Ahora tenemos el
principio de
responsabilidad única en la práctica. Nuestro módulo de cliente
tiene todo el código para definir y validar
un objeto cliente Sabe cómo
debe ser un cliente. Nuestros clientes Módulo JS conoce todo sobre diversas rutas
para trabajar con los clientes. Entonces aquí no tenemos ningún código sea manejar rutas
expresas. ¿Bien? Eso significa que ya
no necesitamos cargar
alegría en este módulo porque validar un objeto
cliente ahora es responsabilidad
de este
nuevo módulo, customer dot JS ¿Bien? Ahora, finalmente,
al final de este módulo, necesitamos exportar
esta clase de cliente así
como esta función de validar
cliente. Entonces escribimos módulo dot export. Agregamos cliente aquí
en este objeto o una forma más corta es simplemente
usar la propiedad de exportación. Antes, les dije que las exportaciones son referencia
a las exportaciones de módulo punto. Así que simplemente podemos agregar
propiedades adicionales en ese objeto. Del mismo modo, necesitamos exportar
esta función de validación. Podemos acortar el nombre. Entonces, en lugar de validar al cliente, podemos usar validar y configuramos
esto para validar al cliente. ¿Bien? Ahora de vuelta en
nuestro antiguo módulo, aquí tenemos dos opciones. Una es cargar así el módulo del
cliente. Así que cliente constante,
configuramos esto para que requiera. Ahora aquí, tenemos que subir
un nivel y luego ir a la carpeta de modelos y luego cargar el módulo de
cliente. Entonces este módulo cliente, este objeto tiene dos propiedades. Uno es cliente, el
otro es validar. Si cargamos este
módulo cliente así, para hacer referencia
al tipo de cliente o al modelo de cliente, tenemos que escribir
módulo cliente punto cliente. Y se puede ver que esto
se ve muy feo. Entonces un mejor enfoque es
usar la desestructuración de objetos. Este objeto que se devuelve
de cargar este módulo, sabes que
tiene dos propiedades, cliente y validar. Podemos desestructurar ese
objeto y cargarlo en estas dos constantes,
cliente y validar Entonces ponemos las llaves aquí a la hora de definir
estas constantes Y con esto, la constante del
cliente se
fijará a lo que se
devuelva de este módulo. Mar. Bien. Por lo que no tenemos que repetir
cliente en varios lugares. De igual manera, esta
propiedad de validar se
establecerá en lo que se devuelva
de este módulo, validar. Ahora, finalmente, necesitamos reemplazar este cliente validado
con palidate que es un nombre más corto y más limpio aquí hay otra referencia
que necesitamos actualizar Así que valide. Ahora
con este cambio, si nos fijamos en el
número de líneas de código que tenemos en este módulo, miren, tenemos 54 líneas. Entonces inicialmente, teníamos
más de 80 líneas de código, y ahora tenemos alrededor de
50 líneas de código. Como ejercicio,
quiero que modifiques
el módulo de la empresa. Entonces en rutas, aquí
tenemos empresas. De igual manera, aquí en la parte superior, tenemos la definición
del modelo de compañía. Quiero que extraigas este código y lo pongas
en un módulo separado.