Transcrições
1. Introdução do curso: Bem-vindo de volta ao curso
Express JS, Módulo sete, validação Mangus Esta aula é uma continuação
da série de cursos Express JS Meu nome é Shawn Raganhi e estou empolgado em
guiá-lo neste módulo qual elevamos suas habilidades de volta
e desenvolvimento a um novo patamar,
dominando
a validação do Neste módulo, vamos nos
concentrar na validação, um aspecto crucial de qualquer sistema de back-end de
robôs Você aprenderá como implementar a validação em mangas para
garantir a integridade dos dados Em seguida, você aprenderá a utilizar validadores
integrados
para uma aplicação rápida e eficaz de
restrições e, em seguida, a criar validadores
personalizados sob medida para Depois disso, você
aprenderá a lidar e responder aos
erros de validação com elegância
e, finalmente, a personalizar as opções de
esquema para Este módulo é um
divisor de águas para desenvolvedores desejam criar aplicativos confiáveis
e escaláveis Ao dominar a validação do
Mongoose, você escreverá um código mais limpo e livre de
erros, reduzirá bugs e garantirá que seus dados sejam sempre
consistentes Essas são algumas
das habilidades essenciais para criar APIs prontas para
produção Neste módulo, como um projeto, continuaremos construindo
o aplicativo Fair Wheels. Primeiro, você aprimorará a API da empresa
substituindo a
matriz na memória pelo Mongo DB Em seguida, você criará o APA de
um novo cliente, completo com
operações e validação completas de multidões. Este projeto prático
solidificará sua compreensão sobre integração
da validação
do
Mongoose a integração
da validação
do
Mongoose em aplicativos do mundo real. Este módulo está
repleto de técnicas valiosas e experiência prática para ajudá-lo a criar back-ends melhores Então, vamos mergulhar e
fazer suas habilidades brilharem. Nos vemos na primeira palestra.
2. Implementando a validação no Mongoose: I Então, esse é o esquema principal que definimos
anteriormente na seção Agora, por padrão, todas
essas propriedades que definimos aqui
são opcionais. Então, se eu criar um curso e omitir todas
essas propriedades salvar
a bolsa no banco de dados, essa será uma operação perfeitamente
válida Mongo DV não se
importa com o fato de termos um curso que não tem nome ou não tem preço Nesta palestra,
mostrarei como implementar a validação Agora, para esta demonstração,
falarei apenas sobre o validador
necessário Mas temos mais
validadores integrados que você aprenderá
na próxima palestra Então, vamos tornar esse
nome obrigatório. Primeiro, substituímos a
string por um objeto aqui. Definimos o tipo como string
e, em seguida, definimos required, true. Com isso, se eu criar um curso sem nome,
vamos falar sobre isso. No momento em que eu tentar salvar
esse curso no banco de dados, vou receber uma
exceção. Deixe-me te mostrar. Então, primeiro, vamos
voltar ao final
desse arquivo e excluir,
remover o curso. Agora entre e crie um curso. Agora, de volta ao terminal,
vamos executar o aplicativo. Tudo bem Veja o que temos. Recebemos esse erro de variação. Se você ver esse erro, isso basicamente
significa que você não lidou com essa rejeição Então, só para refrescar sua memória, lembre-se de que as promessas podem
estar em três estados Inicialmente, eles estão pendentes e,
em seguida, podem ser
preenchidos ou rejeitados. Nesse caso, temos
uma promessa rejeitada. Portanto, não lidamos com
isso adequadamente. Então, de volta ao código aqui, ao salvar esse curso
no banco de dados, veja, o método save
retorna uma promessa. Estamos esperando lá
para obter o resultado. Portanto, com essa implementação, estamos apenas assumindo
o cenário de sucesso Se a promessa for rejeitada, não
temos nenhum
código para lidar com isso. Então, anteriormente, eu disse que
você deveria colocar esse código em
um bloco de cache tr. Então, vamos mover isso aqui. Adicione o bloco de cache aqui, obtemos uma exceção e, seguida, podemos exibir a
mensagem de exceção no canso Agora, de volta ao terminal, vamos executar o aplicativo mais
uma vez. Então, não recebemos mais um
aviso. Em vez disso, recebemos
essa mensagem de erro. Se a validação falhar,
o nome do caminho é obrigatório. Portanto, se tivermos um objeto de curso
inválido, Mongoose não nos permitirá salvar o curso
por meio do banco Portanto, a validação é iniciada
automaticamente
no momento em que tentamos salvar um
curso no banco de dados Também podemos
acionar manualmente a validação. Deixe-me comentar
essas duas linhas. Esse objeto do curso tem
um método de validação. Agora, esse método de validação, olha, ele retorna uma promessa de nulo, então podemos esperar E se nosso curso for inválido, obteremos uma exceção e acabaremos
nesse bloco de cache Então, vamos voltar ao índice do nó
terminal e,
olha, obtivemos o mesmo erro de
validação. O nome do caminho é obrigatório. Agora, uma coisa que eu
pessoalmente não gosto no
design do mangusto é que esse método variado
mantém a promessa de vazio Então, aqui não
temos nenhum resultado. Idealmente, esse método de validação
deve retornar um booleano. Então, poderíamos dizer que isso é válido. E então, se o
curso não for válido, poderíamos ter alguma lógica aqui. Então, isso é uma
falha de design e mangusto. Ele retorna uma promessa de vazio. Agora, a única opção
para obter esse tipo de booleano é passar
um retorno de chamada Então, em vez de
esperar a promessa, temos que voltar à abordagem da fase de
retorno de chamada Então, aqui passamos uma função
que pega um objeto de erro
e, em seguida, podemos verificar
se temos algum erro. Então, podemos executar alguma lógica. Agora você pode perguntar, já
temos esse bloco de cache aqui. Então, se tivermos algum erro de
validação, podemos executar esse
tipo de lógica aqui. Isso é verdade, mas escrever código como esse é um
pouco confuso. Então, espero que em algum momento
no futuro, a equipe de
Mongo mude esse
método para Dana Agora, deixando isso de lado, vamos mover esse código e voltar
ao nosso código original. Uma coisa que preciso
esclarecer aqui é que essa validação que
implementamos na propriedade name só
é significativa em mongoos O Mongo DB não se
importa com essa propriedade de nome. Portanto, se trabalhamos
com bancos de dados como SQL server ou MySQL, você sabe que
nesses bancos de dados, podemos definir a validação
no nível do banco de dados Por exemplo, em
nossa tabela de cursos, teremos uma coluna de nome e podemos marcar essa
coluna conforme necessário. Com isso, não podemos armazenar um curso sem o
nome em nosso banco de dados. No Mongo DB, não temos isso. Mongo Dew não se
importa com nada disso. Portanto, essa validação que
implementamos aqui só é
significativa em mongóis No momento em que tentamos
salvar um curso, mongoose executa a lógica de
validação E se o curso não for válido, ele não o salvará
no banco de dados. Agora, uma última coisa que preciso
esclarecer aqui antes de
terminarmos esta palestra. No início da seção
sobre o Express, apresentei a você um pacote
zero chamado Joy Então você pode estar se perguntando quando temos dois tipos de validação. Devemos usar Joy ou
devemos usar mongoose como A resposta é ambas. Esses tipos de validações
se complementam. Por isso, usamos alegria em
nossas APIs RESTful. Usamos isso como o primeiro
ataque para garantir os dados que o cliente está nos
enviando sejam válidos. Mas ainda precisamos desse
tipo de validação em mangos para garantir
que os dados que
salvamos no banco de dados estejam
no formato correto, pois é possível que o cliente
nos envie um curso válido no
corpo da solicitação Mas quando criamos um
objeto de curso em nosso serviço SDDP, talvez tenhamos esquecido de definir a propriedade name de acordo com o que
obtemos do nome do ponto do corpo do
ponto da solicitação Portanto, ao impor a
validação em mangos, podemos garantir que
erros de programação como esse não
resultem na
persistência de
documentos inválidos em um
banco de dados persistência de
documentos inválidos em um seguir, veremos
os erros válidos incorporados nas mangas
3. Utilizando validadores Mongoose integrados: Na última palestra, aprendemos sobre esse validador obrigatório, que é um dos validadores integrados
em mangas Nesta palestra, examinaremos
mais
de perto esses validadores
integrados Portanto, essa propriedade necessária aqui, podemos defini-la como um booleano ou uma função que
retorna um booleano E isso é útil
quando você deseja condicionalmente tornar sua
propriedade necessária ou não Por exemplo, vamos
imaginar que o preço
só é exigido se o
curso for publicado. Vamos adicionar o
validador necessário aqui. Primeiro, substituímos o
número por um objeto. Defina o tipo aqui de
volta para o número. E, em seguida, defina como necessário. Aqui, precisamos
passar uma função. Então, funcione. E
nessa função, retornamos um booleano Então, retornamos isso para referenciar este
ponto de objeto do curso publicado. Portanto, se a publicação for verdadeira, preço será exigido. OK. Agora, aqui, eu preciso
esclarecer uma coisa. Nesse caso específico, não podemos substituir essa função por uma função
de seta. Em outras palavras, se fizermos isso, nosso validador
não funcionará porque as funções de
seta não
têm isso próprio Eles usam esse valor do contexto
de execução anexo. Nesse caso específico,
há uma função em
algum lugar do mangoose
que chamará essa Essa referência que temos aqui
fará referência a essa função, não ao objeto do curso com o qual
estamos lidando aqui. Então, precisamos reverter isso de
volta para uma função normal. Agora, vamos testar essa validação. Então, aqui está o objetivo do nosso curso. Vou remover o preço e você verá que o
curso foi publicado. Portanto, devemos ter dois erros de
validação. Agora, de volta ao terminal, vamos executar o aplicativo. Veja, o preço do caminho é obrigatório e o nome do caminho também
é obrigatório. Agora, mais tarde,
mostrarei como obter mensagens
de erro
individuais dessa exceção. Por enquanto, estamos apenas recebendo a mensagem como uma string simples. Portanto, este é o nosso validador
obrigatório. Podemos definir isso como
um simples booleano ou uma função para condicionalmente
tornar uma propriedade necessária Agora, dependendo do tipo
de propriedades que temos aqui, temos validadores adicionais
integrados Por exemplo, com cordas, também
temos comprimento mínimo e comprimento
máximo. Deixe-me te mostrar. Eu vou detalhar isso. Aqui, adicionamos o comprimento mínimo. Digamos que queremos ter
certeza de que temos pelo menos
cinco personagens. Aqui também podemos definir o comprimento máximo. Digamos que 255 caracteres. Também temos MT, e aqui podemos passar
uma expressão regular. Agora, nesse caso específico, não
faz
sentido aplicar uma expressão regular
no nome de um curso. Então, eu vou
elogiar isso. Outro validador útil que
temos para strings é o Enum. Vou criar
outra propriedade aqui. Vamos chamar essa categoria. E defina a string do tipo dois. Agora, aqui, podemos usar
o validador Enum. Definimos isso como uma matriz
de strings válidas. Digamos que temos algumas categorias
predefinidas, rede móvel
web e assim por diante Portanto, ao criar um curso, a categoria que definimos deve
ser um desses valores. Caso contrário,
obteremos um erro de validação. Então, deixe-me tornar isso obrigatório. Agora, de volta ao nosso objeto do curso. Vamos adicionar a categoria e vou definir
isso para apenas anexar. Agora vamos trazer de
volta o nome e o preço. Portanto, só podemos ver o
erro de validação da categoria. Então, de volta ao
nó do terminal, indexado ou perseguido,
veja, categoria não é um valor enumerado válido
para a categoria de caminho Então, esses são os validadores
específicos para strings. Temos Min Land, comprimento máximo, correspondência para usar uma
expressão regular e número. Para números,
temos mínimo e máximo. Então, aqui, o preço é um número. Podemos definir um mínimo de
$10 e um máximo de $200. E também temos esses
dois validadores para datas. Na próxima palestra,
você aprenderá sobre validadores
personalizados
4. Criando validadores personalizados no Mongoose: Às vezes, os validadores integrados
no mango não nos fornecem o
tipo de validação de que precisamos Por exemplo, veja
essa propriedade de tags. Nossa tag é uma matriz de strings. E se quisermos
impor essa regra que cada núcleo deve
ter pelo menos uma tag Não podemos usar o validador
necessário porque, com required, podemos simplesmente passar
uma matriz vazia, e isso será perfeitamente válido para o ponto de vista de Mangus Então, aqui precisamos de um validador
personalizado. Então, primeiro, precisamos
substituir isso por um objeto para substituir
isso por um objeto. Aqui, definimos o tipo como array. Agora precisamos definir
um validador personalizado. Então, aqui definimos a
propriedade válida para um objeto. Nesse objeto, temos uma
propriedade chamada validator, que definimos como uma função Essa função usa um argumento, que é a abreviação de valor. E aqui podemos implementar
nossa lógica de validação personalizada. Então, podemos devolver
algo assim. Se Galeno for maior que zero
, essa propriedade
será válida Também podemos definir uma mensagem
personalizada aqui. Portanto, esse objeto válido tem outra propriedade
que é message. Então, mensagem, nós definimos isso também. Um núcleo deve ter
pelo menos uma tag. Agora, vamos testar isso. Então, de volta ao nosso
objeto de curso, primeiro, vou definir
a categoria como um valor válido, então web, depois vou
passar uma matriz mt. Então, de volta ao
nó terminal, indexado ou tem. Tudo bem, olha, um núcleo
deve ter pelo menos uma escavação. E se excluirmos essa
propriedade dessa forma? Vamos ver o que acontece. Mais uma vez, recebemos
a mesma mensagem. Um núcleo deve ter pelo
menos uma escavação. Portanto, se não definirmos essa propriedade porque definimos seu
tipo como uma matriz, mongoose inicializará
isso em uma Agora, e se
definirmos isso como nulo? Então, agora de volta ao terminal. Ok, olha, não consigo ler o comprimento da
propriedade do nó. Esse não é o tipo de mensagem de validação que
queremos receber. Então, precisamos modificar nossa lógica de validação para
algo assim. Se tivermos um valor e a propriedade de comprimento
for maior que zero, essa propriedade será válida. Então, de volta ao terminal,
vamos executar isso mais uma vez. Um núcleo deve ter pelo
menos uma etiqueta, linda. Então é assim que você define
um validador personalizado. Você define a
propriedade validate como um objeto. Nesse objeto, você adiciona
essa função validadora
e, de forma otimizada,
pode definir uma mensagem
5. Lidando com erros de validação no Mongoose: Até agora, exibimos apenas uma mensagem simples sobre
nosso erro de validação. Nesta palestra,
examinaremos esse
objeto de erro com mais detalhes Portanto, essa exceção que obtemos
no bloco de cache tem uma
propriedade chamada errors. Nesse objeto, temos
uma propriedade separada para
cada propriedade inválida
em nosso objeto de curso Deixe-me mostrar o que quero dizer. Então, de volta ao nosso objeto de curso, aqui estão as
propriedades das portas. No momento, aqui temos uma propriedade
inválida que é tag. Vamos também tornar a categoria
uma propriedade inválida. Vou ajustar isso para um traço. Agora, com esses erros o
objeto que
obtemos terá duas propriedades. Uma são as tags, a
outra é a categoria. Está bem? Assim, podemos iterar
para todas as propriedades desse objeto de erro e obter mais detalhes sobre
cada erro de validação Então, para o campo em
erro que comete erros, aqui fazemos um log do console. Vamos aos erros R t, encontramos essa propriedade,
obtemos seu valor. Agora, esse é um objeto de erro de
validação. Vamos dar uma olhada. Então, de volta ao ponto de índice do nó
terminal Js, deixe-me rolar para cima e ver
o que está acontecendo aqui. Tudo bem. Então, veja aqui, temos um objeto de
erro de validação. Essa é a mensagem. Abaixo disso, temos o rastreamento da pilha, ok? Agora, deixando tudo isso de lado, essas são as propriedades
que temos na opção de
erro de validação. Então, aqui temos uma propriedade
chamada properties, que nos fornece informações sobre os requisitos
de validação dessa propriedade. Então, aqui temos acesso à
nossa função de validador. Você pode ver que o tipo
desse validador é Enum. Esses são os
valores de enumeração válidos para essa propriedade. A determina o nome
da nossa propriedade, nesse caso, categoria e valor é o valor atual. Portanto, nosso objeto de erro de validação tem propriedades e
algumas outras propriedades. Um é kind, que
é definido como Enum, e isso é basicamente um
atalho para o tipo de propriedades Também temos outro caminho
curto de propriedade
, definido como
categoria e valor, que é o
valor atual dessa propriedade. Então, aqui estamos iterando esses objetos
de
erro de validação E aqui temos vários erros de
validação. Então esse é o primeiro. E abaixo disso, veja, temos outro objeto de erro de
validação. Isso é para um núcleo
que deve ter pelo menos uma tag. Então, se você rolar para
baixo, poderá ver
que tipo de erro de
validação é definido pelo
usuário, porque aqui
temos um validador personalizado O caminho são tags, o valor
atual é nulo. Portanto, se você quiser receber a mensagem de erro de
validação para cada propriedade inválida, podemos simplesmente acessar
essa propriedade da mensagem Agora, de volta ao terminal, vamos executar o aplicativo novamente. Portanto, temos duas mensagens de
erro de validação. Dash não é um
valor de enumeração válido para a categoria de caminho, e aqui está o segundo erro de
validação para nossa propriedade de texto
6. Opções de tipo de esquema e personalização no Mongoose: Então, ao definir um esquema, você aprendeu que
podemos definir o tipo de uma propriedade diretamente aqui ou
usar um objeto do tipo esquema Agora, esse objeto tem
algumas propriedades. Você aprendeu
sobre alguns deles. Você conhece a propriedade de tipo, conhece a
enumeração necessária e assim por diante Nesta palestra, veremos mais
algumas
propriedades úteis que estão disponíveis nesses objetos do tipo
de esquema Portanto, para strings, temos três propriedades adicionais
que você pode usar Temos letras minúsculas. Podemos definir isso como verdade. E com isso, o mangoose
converterá automaticamente o valor dessa propriedade de
categoria Deixe-me mostrar como isso funciona. De volta ao nosso objeto de curso. Ok, primeiro, vou
remover esse erro de validação. Então, vamos mudar a
categoria para web e observar que aqui estou usando
um W maiúsculo, certo Vou definir
tags para, digamos, não terminar agora aqui nos terminais
do aplicativo. Ok, criamos um objeto do curso e o salvamos no banco de dados. Agora veja a categoria. É uma web em minúsculas. E se você procurar uma bússola, vamos atualizar essa lista Então, aqui está nosso novo documento. A categoria é definida como
uma web em minúsculas. Então é assim que a propriedade
minúscula funciona. Também temos letras maiúsculas. Novamente, podemos definir isso como verdadeiro. Agora, tecnicamente, devemos usar um desses,
não os dois. E, finalmente, temos o acabamento. Portanto, se tivermos acolchoamentos
ao redor da corda, o mangusto removerá automaticamente Portanto, essas três propriedades estão disponíveis ao usar strings. Agora temos mais algumas propriedades
no objeto
do tipo esquema, e essas propriedades
podem ser usadas ao definir qualquer propriedade,
independentemente de seu Por exemplo, vamos voltar
à nossa propriedade de preço. Digamos que sempre queremos
arredondar o valor do preço, para que possamos definir um
getter personalizado e um setter personalizado Então, aqui, passamos uma função de seta que usa
V ou valor como argumento. Agora podemos definir nossa
lógica personalizada ou obter esse valor, para que possamos aplicar um ponto matemático ao
redor desse valor. Agora, podemos
definir de forma semelhante um conjunto personalizado. E aqui passamos uma função
similar. Então vamos para a rodada de pontos matemáticos. Portanto, sempre que definirmos
a propriedade de preço, o conjunto de funções
será chamado e aqui
arredondaremos esse valor. Então, com isso, se voltarmos ao nosso objeto de curso e
definirmos o preço em 15,8, vamos ver o que acontece Então, de volta ao terminal, vamos
executar o aplicativo novamente. Olha, criamos um
novo objeto grosso e o preço está definido para 16 Então, aqui, quando definimos esse valor, nosso
configurador personalizado foi chamado E aqui arredondamos esse valor. Agora, de volta ao Compass, aqui está nosso último documento do curso Você pode ver que o
preço está definido como 16. Agora vamos editar isso. Você pode ver que o tipo
dessa propriedade está definido como Int 32, que é um número inteiro Vou mudar isso para o dobro e depois alterar
o valor 16-15 0,8 E, finalmente, clique em Atualizar
para confirmar minhas alterações. Então, aqui, estou simulando
um cenário em que temos um documento que foi armazenado no banco de dados antes de
implementarmos essa lógica de arredondamento Nesse caso, se você ler esses cursos e
acessar a propriedade price, nosso coletor personalizado
será chamado E aqui,
arredondaremos esse valor. Deixe-me mostrar como isso funciona. Vamos voltar à nossa função de
obter cursos. Anteriormente, implementamos
essa lógica de paginação na demonstração. Nós não precisamos disso. Então, vou comentar
essas duas linhas
e, em seguida, vou alterar
o objeto de consulta para que possamos
ler o curso específico. Então, queremos obter
o curso com ID definido para copiar o valor
desse ID do curso. Então, de volta ao Compass,
aqui está o ID do nosso curso. Copie isso e cole aqui. Aqui, obteremos
um curso para que possamos acessar o primeiro
elemento dessa matriz. Agora, se você ler o
preço da propriedade, verá que o valor dessa propriedade
será arredondado. Então, aqui, vamos ler
o preço da propriedade. Vamos entrar neste
curso de criação e ligar para obter cursos. De volta ao terminal. Vamos
executar o aplicativo. Ok, olha, o preço é 16, embora no banco de dados o tenhamos armazenado como 15,8 Então é assim que esses
getters e setters personalizados funcionam. O setter é chamado quando
definimos o valor de uma
propriedade, como aqui, e o getter é chamado quando lemos o
valor de uma
7. Reestruturando nosso projeto FareWheels: Tudo bem Então, aqui está nosso aplicativo
Fair Wheels. Agora, se você observar
o módulo do cliente, você pode ver aqui na parte superior, que estamos definindo esse modelo de
cliente. E abaixo disso, temos
nossos manipuladores de rotas. Depois de todos esses manipuladores de
rotas, temos essa função de validar o
cliente Portanto, esse é um aplicativo bastante
simples. E neste módulo,
temos 85 linhas de código. Se você observar a definição do objeto
do cliente ou
do modelo do cliente, esse não é um modelo grande e complexo. Em uma aplicação do mundo real, nosso modelo de cliente será mais complexo. Então, o código neste
módulo vai crescer, e isso é algo que precisamos
abordar nesta palestra Para manter nossos aplicativos
sustentáveis, devemos garantir
que cada módulo seja responsável por
apenas uma coisa Esse é o
princípio da responsabilidade única na prática. Neste aplicativo, o módulo
desse cliente que temos faz parte
da pasta de rotas. Então, tecnicamente, tudo o que
devemos ter
neste módulo é uma definição
da rota do nosso cliente A definição de
um objeto de cliente realmente
não pertence
a este módulo. Então, nesta palestra,
vamos
extrair esse código e
colocá-lo em outro lugar. Então, eu criei
essa pasta de modelos. Nesta pasta,
teremos módulos como cães de clientes, cães empresa e assim por diante. Então, vamos adicionar um novo
arquivo, customer dot js. Agora, de volta ao Customers dot JS, vou mover
a definição do modelo
do cliente para
dentro do nosso novo modelo. Então, vamos mover isso aqui. Agora, aqui, temos uma
dependência de mangas. Então, vamos voltar
aqui no topo. Esta é a linha
para carregar mangas. Também precisamos carregar o I, como você verá em um segundo. Agora, de volta ao nosso módulo de
clientes, também
vou
mover a função para validar um cliente
dentro do nosso novo módulo Então, cole aqui no final. Agora temos o
princípio da
responsabilidade única na prática. Nosso módulo de cliente
tem todo o código para definir e validar
um objeto de cliente Ele sabe qual
deve ser a aparência de um cliente. módulo JS de nossos clientes conhece tudo sobre as várias rotas
para trabalhar com os clientes. Portanto, aqui não temos nenhum código além de lidar com rotas
expressas. Está bem? Isso significa que não precisamos mais carregar
alegria neste módulo
porque a validação de um objeto
do cliente agora
é responsabilidade desse
novo módulo, customer dot JS Está bem? Agora, finalmente,
no final deste módulo, precisamos exportar
essa classe de cliente bem
como essa função de validação de
cliente Então, escrevemos exportações de pontos do módulo. Adicionamos o cliente aqui
neste objeto ou uma forma mais curta é simplesmente
usar a propriedade de exportação. Anteriormente, eu disse que exports é uma referência
às exportações de pontos do módulo. Então, podemos simplesmente adicionar
propriedades extras nesse objeto. Da mesma forma, precisamos exportar
essa função de validação. Podemos encurtar o nome. Então, em vez de validar o cliente, podemos usar a validação e configuramos
isso para validar o Está bem? Agora, de volta ao
nosso módulo antigo, aqui temos duas opções. Uma delas é carregar o módulo
do cliente dessa forma. Então, cliente constante,
definimos isso como obrigatório. Agora, aqui, precisamos subir
um nível e depois ir para a pasta de modelos e carregar o módulo do
cliente. Então, esse módulo do cliente, esse objeto tem duas propriedades. Um é cliente, o
outro é validar. Se carregarmos esse
módulo do cliente dessa
forma, para referenciar
o tipo ou o modelo do cliente, teremos que escrever o
módulo do cliente dot customer. E você pode ver que isso
parece muito feio. Portanto, uma abordagem melhor é
usar a desestruturação de objetos. Esse objeto que é retornado
do carregamento deste módulo, você sabe que ele
tem duas propriedades, customer e validate. Podemos desestruturar esse
objeto e carregá-lo nessas duas constantes,
cliente e Então, colocamos as chaves aqui ao definir
essas constantes E com isso, a constante
do cliente será configurada para o que é
retornado desse módulo. Mar. Ok. Portanto, não precisamos repetir o
cliente em vários lugares. Da mesma forma, essa
propriedade de validação será definida para o que é retornado
desse módulo, validate Agora, finalmente, precisamos substituir esse cliente
validado por palidate, que é um nome mais curto e mais limpo Aqui está outra referência
que precisamos atualizar Então valide. Agora,
com essa alteração, se você observar o
número
de linhas de código que temos neste módulo, veja, temos 54 linhas. Então, inicialmente, tínhamos
mais de 80 linhas de código e agora temos cerca de
50 linhas de código. Como exercício,
quero que você modifique
o módulo da empresa. Então, nas rotas, aqui
temos empresas. Da mesma forma, aqui no topo, temos a definição
do modelo da empresa. Quero que você extraia esse código e o coloque
em um módulo separado.