‫Instrutor: Em seguida, vamos falar sobre validadores personalizados.
‫Portanto, às vezes os validadores integrados simplesmente não são suficientes.
‫E, nesse
‫caso, também podemos construir nossos próprios validadores personalizados.
‫E um validador é na verdade apenas uma função simples
‫que deve retornar verdadeiro ou falso.
‫E se retornar falso, significa que há um erro.
‫E por outro lado, quando retornamos
‫true, então a validação está
‫correta e a entrada pode ser aceita.
‫Ok, vamos agora construir um validador customizado simples aqui.
‫E o que eu quero validar é se o desconto no preço
‫é realmente inferior ao preço em si.
‫Isso é algo que não
‫podemos fazer usando os validadores embutidos,
‫então vamos simplesmente construir os nossos próprios.
‫Precisamos agora especificar aqui um objeto
‫para as opções SchemaType.
‫Tudo bem.
‫Portanto, o tipo é o
‫número e, para especificar nosso validador,
‫usamos a propriedade validate.
‫Valide e, como eu disse, uma função de
‫retorno de chamada simples.
‫E de novo, não uma função
‫de seta, mas uma
‫função real,
‫pois nesta função teremos acesso a esta variável,
‫que apontará para o documento atual.
‫Agora, se você não precisa dessa variável, então você
‫pode, é claro, apenas usar uma função de seta.
‫Temos uma função de
‫retorno de chamada, e essa função de retorno de chamada
‫realmente tem acesso ao valor que foi inserido.
‫Portanto, neste caso, o desconto no preço que o usuário especificou.
‫Então é isso que chamo de valor, val para abreviar.
‫Lembre-se de que precisamos retornar
‫verdadeiro ou falso a partir deste validador.
‫Quando queremos retornar
‫falso e quando queremos retornar verdadeiro?
‫Bem, queremos um erro quando o desconto no preço
‫for maior ou igual ao preço.
‫E então, basicamente, o que queremos retornar
‫aqui é o teste para testar se o
‫valor é menor que isso. preço.
‫Certo, digamos que o desconto no preço seja 100
‫e que o preço real seja 200.
‫100 é menos que 200, verdadeiro e, portanto, não temos erro.
‫E isso faz sentido porque é exatamente o que queremos.
‫O desconto no preço deve ser sempre menor.
‫Por outro lado, se o desconto for 250,
‫isso será falso.
‫E então false, lembre-se, irá disparar um erro de validação.
‫Vamos agora testar na verdade.
‫Preço
‫(clacking do teclado) e desconto
‫no preço.
‫E vamos usar os valores que
‫usamos antes e também preciso alterar o nome aqui.
‫Ok, agora nosso desconto é maior do que o preço e, portanto,
‫devemos obter nosso erro.
‫Ok, de fato, temos um erro de validação.
‫Então, falhou para o desconto do preço do caminho.
‫Agora, não temos nenhuma mensagem personalizada aqui, então
‫vamos corrigir isso rapidamente.
‫Tudo bem, e a maneira como fazemos isso é muito semelhante
‫à que fizemos com o enum.
‫Portanto, precisamos realmente especificar outro objeto e, em seguida,
‫definir a propriedade da mensagem.
‫Validate
‫deve ser um objeto
‫e então teremos nossa mensagem lá
‫e esta função aqui ficará
‫em uma propriedade chamada validator.
‫Ok e nossa mensagem aqui será
‫(barulho de teclado), o preço com desconto
‫deve estar
‫abaixo
‫do preço normal.
‫Aqui precisamos de uma vírgula e agora estamos bem.
‫E, na verdade, um truque muito bom é que essa mensagem
‫aqui também tem acesso ao valor.
‫E isso funciona de uma maneira meio estranha
‫e realmente é interno ao Mongoose, então
‫não tem nada a ver
‫com JavaScript, então posso simplesmente usar as chaves aqui e depois o valor.
‫Portanto, esta parte aqui terá acesso
‫ao valor que foi inserido,
‫portanto, tem exatamente o mesmo valor que esta variável val.
‫Então, vamos
‫testar isso novamente e agora realmente
‫recebemos nossa mensagem e até mesmo acessaremos o preço de 250 que especificamos aqui.
‫Agora vamos alterá-lo para 100 e agora deve funcionar
‫e sim, funciona.
‫Tão bom.
‫Agora, há uma advertência muito importante que
‫precisamos observar aqui e é
‫que dentro de uma função de validador, essa
‫palavra-chave só vai apontar para o
‫documento atual
‫quando estivermos criando um novo documento.
‫Portanto, esta função aqui não funcionará na atualização.
‫E isso é muito importante notar.
‫Veja, no Mongoose, há algumas advertências que
‫você realmente precisa estar ciente
‫ao trabalhar com ele.
‫E eu aprendi tudo isso por experiência
‫e é por isso que agora posso contar a você.
‫Então, encontrei um erro uma vez com este e,
‫a partir de
‫então, sei que só posso usar esse tipo
‫de validador com uma palavra-chave
‫this quando estiver realmente criando novos documentos.
‫Então, deixe-me escrever isso aqui para você.
‫(teclado estalando) Tudo bem, então
‫espero que você esteja anotando todas
‫essas pequenas informações muito importantes que são
‫muito importantes.
‫A mesma coisa aqui embaixo.
‫Lembre-se de onde eu
‫disse a você que este DOCUMENTO MIDDLEWARE só roda para
‫salvar e criar, mas não para atualizar.
‫E essa é uma das outras
‫coisas que são realmente importantes para nunca esquecer.
‫Agora, neste caso
‫específico aqui, existem maneiras de corrigir isso, mas
‫são muito complicadas e não vale a pena persegui-las.
‫E poderíamos, é claro, também escrever funções de
‫validador que não dependem dessa variável.
‫Portanto, neste caso, só precisamos dele porque
‫estamos comparando um valor com o valor de outro campo.
‫Este é um validador personalizado que podemos usar no Mongoose
‫e que na verdade escrevemos nós mesmos.
‫Mas também, há algumas bibliotecas no
‫npm para validação de dados que podemos simplesmente
‫conectar aqui como validadores personalizados que não temos que escrever.
‫E a biblioteca mais popular é chamada de validador,
‫então vamos dar uma olhada nela.
‫Validator e, em seguida, estou pesquisando o
‫GitHub porque geralmente todas essas bibliotecas estão sempre no GitHub.
‫E a documentação também estará lá e
‫aqui você vê que
‫o validador
‫é uma biblioteca de validadores e higienizadores de string.
‫Você também vê que é bastante popular com 13,00 estrelas
‫e isso
‫é muito bom.
‫Também vemos que esta biblioteca valida
‫e limpa apenas strings.
‫Aqui estão todas as coisas como o
‫instalamos e como o usamos, mas é bem simples.
‫Já sabemos disso.
‫Mas o que quero mostrar a
‫vocês é a lista de todos os validadores disponíveis.
‫Por exemplo, temos isAlpha, que
‫verifica se a string contém apenas letras.
‫Temos alfanumérico, portanto, apenas letras e números, e realmente
‫temos muitas coisas aqui.
‫Portanto, verifique se uma string
‫é booliana ou se a string é um cartão de crédito,
‫portanto, um número de cartão de crédito válido.
‫Ou se for uma moeda ou
‫se você realmente ver todos os tipos de testes diferentes.
‫Por exemplo, um ISBN, para verificar números de livros.
‫Para testar se é um inteiro ou se a string está em minúsculas.
‫E como você pode ver, sempre que precisar de alguma validação
‫de dados, você pode pegar
‫uma dessas bibliotecas e simplesmente conectá-las aos seus validadores Mongoose.
‫Agora, muitas das coisas que
‫estão aqui na verdade já estão
‫integradas ao Mongoose e, portanto, não precisamos de todas
‫elas, ok, mas há uma muito
‫específica que desejo usar, que é o Alpha.
‫Portanto, quero verificar se o nome do passeio contém apenas letras.
‫E para isso posso usar esta
‫função da biblioteca do validador.
‫Vamos
‫voltar e
‫começar
‫instalando o validador
‫npm i (clacking
‫de teclado).
‫Isso foi um sucesso.
‫Então eu preciso
‫importá-lo aqui e agora estamos prontos para realmente usá-lo aqui.
‫Vou usá-lo aqui
‫e novamente, uso a propriedade validate e
‫agora tudo que preciso
‫fazer é realmente conectar a função aqui.
‫E no validador funciona assim, onde
‫validador é um objeto
‫e aí temos todos esses métodos.
‫Validator é Alpha,
‫então esse
‫é
‫o que acabamos de
‫escolher na documentação.
‫E é isso mesmo.
‫Portanto, não o chamamos aqui.
‫Basicamente, apenas especificamos que esta
‫é uma função que deve ser usada.
‫Assim como o nosso, como o nosso validador, não
‫o chamamos.
‫Simplesmente colocamos esta função de retorno de
‫chamada aqui, que
‫será chamada assim que os dados forem validados.
‫E aqui é o mesmo.
‫Agora, se quisermos especificar uma mensagem de
‫erro, funciona exatamente como aqui.
‫Podemos especificar uma matriz e, em seguida, a mensagem de erro após a
‫função de retorno de chamada.
‫E poderíamos ter feito isso aqui.
‫Então aqui nós fizemos de forma diferente.
‫Aqui, criamos este novo objeto com
‫o validador e a mensagem, mas poderíamos ter
‫feito isso com um array também,
‫mas isso pareceria estranho.
‫Mas aqui em cima, como a função é tão
‫pequena, então isso é tão pequeno, podemos simplesmente colocá-la aqui
‫e, como um segundo argumento no array, adicionar
‫a mensagem de erro.
‫O nome do passeio
‫deve conter apenas (barulho de teclado) personagens.
‫Ótimo, verifique isso.
‫De volta ao Postman, vamos nos livrar do nosso desconto no preço.
‫E vamos adicionar alguns números aqui.
‫E então isso deve falhar no
‫teste e, de fato, o nome deve conter apenas caracteres.
‫Vamos nos livrar disso.
‫Também não podemos usar este nome.
‫Já usamos antes,
‫então pode ser escrito aqui também com
‫caracteres e ainda obtemos esse erro aqui.
‫Bem, isso é provavelmente por causa dos espaços.
‫Então, vamos nos livrar dos espaços,
‫o que obviamente não vai ser realmente útil
‫e, na verdade, agora funciona.
‫Então o problema eram os
‫espaços, mas obviamente queremos manter os espaços aqui.
‫Na verdade, esse erro de validação não é realmente útil e, portanto,
‫vou me livrar dele.
‫Considere que isso aqui foi apenas para demonstrar que
‫podemos usar uma biblioteca externa como essa
‫para realizar a validação.
‫E, na verdade, ainda usaremos essa biblioteca um pouco
‫mais tarde, quando verificarmos se o e-mail do usuário é realmente válido.
‫Essa é outra
‫função interessante incluída nesta biblioteca.
‫Então, novamente, é assim que funciona.
‫Não é realmente útil neste
‫caso, portanto, se realmente
‫quiséssemos testar se a string contém apenas letras e espaços,
‫provavelmente seria
‫mais simples usar uma expressão regular para
‫testar esse tipo de padrão.
‫Mas não vou
‫fazer isso aqui porque esta palestra
‫foi mais sobre esses validadores personalizados.
‫De qualquer forma, com esta palestra, agora estamos prontos
‫com a introdução ao Mongoose.
‫Agora, como você pode imaginar, é claro
‫que ainda há muito a aprender sobre
‫o Mongoose e, na verdade, temos uma seção avançada do Mongoose
‫um pouco mais tarde
‫no curso e, claro, também nas outras
‫seções, você continuará aprendendo mais e
‫mais sobre como usar o
‫Mongoose de uma forma realmente profissional.
‫Você já aprendeu muito até este
‫ponto, parabéns por ter chegado tão longe e é
‫ótimo ver que você ainda está comigo aqui.
‫Bom trabalho e espero vê-lo em breve.