O curso Express. js - Módulo 7: validação de Mongoose | Shivendra Raghuvanshi | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

O curso Express. js - Módulo 7: validação de Mongoose

teacher avatar Shivendra Raghuvanshi, Lead Developer and Online Teacher

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução do curso

      1:59

    • 2.

      Implementando a validação no Mongoose

      7:40

    • 3.

      Utilizando validadores Mongoose integrados

      5:02

    • 4.

      Criando validadores personalizados no Mongoose

      3:16

    • 5.

      Lidando com erros de validação no Mongoose

      3:24

    • 6.

      Opções de tipo de esquema e personalização no Mongoose

      5:36

    • 7.

      Reestruturando nosso projeto FareWheels

      6:14

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

2

Estudantes

--

Projeto

Sobre este curso

Módulo 7: a validação do Mongoose mergulha profundamente em um dos aspectos mais cruciais do desenvolvimento de backend — a validação de dados. Neste módulo, você vai aprender como garantir a integridade e a confiabilidade dos dados do seu aplicativo com o Mongoose. Você vai explorar validadores embutidos, criar lógica de validação personalizada e lidar com erros com graça. Ao final deste módulo, você será capaz de implementar técnicas de validação robustas que melhoram a estabilidade do seu aplicativo e a experiência do usuário.

O que você aprenderá

  • Como implementar a validação em esquemas Mongoose para garantir a integridade dos dados.
  • Utilizando os validadores embutidos do Mongoose para impor restrições.
  • Criando validadores personalizados adaptados às necessidades específicas do seu aplicativo.
  • Lidar e responder a erros de validação de forma eficaz.
  • Personalizando opções de tipo de esquema para atender aos requisitos de dados.

Também vamos reestruturar o aplicativo FareWheels para integrar essas técnicas de validação em cenários do mundo real.

Conheça seu professor

Teacher Profile Image

Shivendra Raghuvanshi

Lead Developer and Online Teacher

Professor
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

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.