‫Narrador: Neste vídeo, vamos falar sobre
‫o segundo tipo de middleware Mongoose, que é
‫o middleware de consulta.
‫E, como o nome já diz,
‫o middleware de consulta nos permite executar funções antes ou
‫depois de uma determinada consulta ser executada.
‫E agora vamos adicionar um gancho
‫de pré-localização, basicamente, um middleware que será executado
‫antes de qualquer consulta de localização ser executada.
‫Então, vamos adicionar outro comentário aqui.
‫Portanto, este é um middleware de consulta.
‫E, claro, funciona de maneira muito semelhante
‫a antes.
‫Então o tourSchema, e então o pre, e
‫aqui nós definimos o hook, que será
‫"find.
‫"Então, função e, novamente, temos
‫acesso à próxima função.
‫E, na verdade, vamos começar chamando-o
‫aqui no final para que não o esqueçamos.
‫Ok, então você vê que se
‫parece exatamente com o outro middleware,
‫o outro pré-gancho.
‫A única diferença aqui é realmente esse gancho de
‫localização, que tornará esse middleware de
‫consulta e não o documentará.
‫Tudo bem?
‫E então, a grande diferença aqui
‫é que esta palavra-chave agora apontará para a consulta atual e não
‫para o documento atual,
‫porque não estamos realmente processando nenhum documento aqui.
‫Estaremos realmente processando uma consulta.
‫OK?
‫E o caso de uso que faremos aqui é este.
‫Então, vamos supor que possamos
‫ter passeios secretos em nosso banco de
‫dados, como para passeios que são oferecidos apenas internamente,
‫ou para um grupo VIP de pessoas muito pequeno, e
‫que o público não deva saber.
‫Agora, como esses passeios são
‫secretos, não queremos que os passeios secretos jamais apareçam nas
‫saídas de resultados.
‫Direito?
‫E então o que vamos fazer é criar um campo de
‫turismo secreto e, em seguida, consultar apenas os passeios que não são secretos.
‫Tudo bem?
‫Então, vamos fazer isso.
‫Comece adicionando aqui, e vamos fazer isso no final.
‫secretTour, então o tipo deve ser um booleano, e acho que esta
‫é a primeira vez
‫que estamos realmente usando um
‫booleano, então isso seria verdadeiro ou falso.
‫Portanto, se for verdade,
‫é um tour secreto e
‫não queremos que apareça e, por padrão, é falso.
‫Tudo bem?
‫E então, basicamente, os passeios geralmente não são secretos.
‫OK.
‫Em seguida, vamos criar um tour secreto
‫para que possamos testá-lo, certo?
‫Então, vamos chamar isso aqui de Super Secret Tour.
‫Tudo isso não
‫importa, e deixe-me apenas dizer que secretTour é realmente verdadeiro.
‫OK?
‫Salve aqui ...
‫E, uh, onde fica isso?
‫Sim. Então secretTour é verdade.
‫E agora vamos ao Compass
‫e deletar todas essas outras turnês que fizemos lá.
‫Então, vamos recarregar isso ...
‫E então, aqui embaixo, devemos ter ...
‫Sim, este tour de teste aqui, podemos excluí-lo.
‫Outro tour de teste ...
‫Então, toda essa desordem aqui,
‫basicamente, queremos nos livrar dela.
‫Nós apenas mantemos o
‫secretTour aqui para que possamos experimentá-lo.
‫Ok, e você vê aqui que secretTour está definido como true,
‫enquanto os outros, é
‫claro, não têm esse atributo,
‫porque, no momento em que os
‫criamos, ainda não tínhamos o secretTour.
‫Então, agora, um pouco antes de começarmos,
‫de volta ao Postman, vamos confirmar que, de fato, a
‫última turnê aqui, e na verdade não é a última turnê,
‫então onde está?
‫Oh, é o primeiro.
‫Então aqui temos o Super Secret Tour, é
‫claro, definido como verdadeiro.
‫Tudo bem? Então, voltando agora, vamos agora
‫executar a consulta como acabamos
‫de dizer no início.
‫Então, novamente, tenha em mente que este aqui
‫agora é um objeto de consulta, certo?
‫E assim podemos encadear todos os métodos
‫que temos para consultas.
‫Isso simplesmente adiciona um método de localização aqui
‫e basicamente seleciona
‫todos os documentos onde secretTour não é verdadeiro, certo?
‫Então secretTour ...
‫E então não é igual a verdade.
‫E estou fazendo assim porque,
‫lembre-se, os editores não estão atualmente configurados como falsos.
‫Eles simplesmente não têm esse atributo.
‫Tudo bem?
‫Ok, então vamos testar agora novamente.
‫E então agora deve ter ido embora.
‫E, de fato, não está mais aqui.
‫Ok, temos todas as viagens que não são secretas, mas
‫não a turnê secreta.
‫E agora estou vendo
‫que temos secretTour definido como falso
‫aqui, mas isso é apenas uma
‫coisa do Mongoose, então vamos dar outra olhada aqui no Compass
‫e recarregar.
‫E então você vê que, na verdade,
‫no banco de dados, secretTour não está definido como falso.
‫O Mongoose está simplesmente adicionando isso porque o temos em
‫nosso esquema como padrão e não está no banco de dados.
‫E é basicamente, então, colocá-lo lá de qualquer maneira.
‫Você vê que, na verdade, temos 11
‫documentos, mas aqui no Postman obtemos apenas dez resultados.
‫E isso,
‫é claro, porque nossa turnê secreta é basicamente filtrada.
‫OK?
‫Então, vamos tentar entender novamente
‫o que realmente acontece.
‫Portanto, assim que chegarmos a essa rota,
‫aqui, usando o método
‫get, vamos ver o que acontece.
‫Então, o que acontece é que criamos uma
‫consulta usando tour. achar.
‫OK?
‫E então, é claro, encadeamos todos
‫esses métodos a ele, conforme falamos em uma
‫das últimas
‫aulas, e então, no final, executamos essa consulta aqui usando await.
‫Direito? Lembre-se disso?
‫Portanto, é aqui que executamos a consulta.
‫Mas, antes de realmente
‫ser executado, então, nosso middleware de pré-localização aqui é executado.
‫OK?
‫E é executado porque
‫é find, assim como usamos aqui.
‫Direito?
‫Portanto, estamos criando uma consulta
‫de localização e, portanto, o gancho de localização é executado.
‫Então, aqui, por se tratar de um middleware de consulta,
‫a palavra-chave this aponta para a consulta.
‫E então, para essa consulta,
‫podemos então encadear outro método find, certo?
‫E lá, filtramos o secretTour usando este
‫objeto de filtro.
‫OK?
‫Então, basicamente dizendo que só queremos
‫tours onde o secretTour não é igual a true.
‫E funcionaria da
‫mesma forma se simplesmente disséssemos
‫aqui, falso, mas acho mais limpo assim.
‫Ok, agora há apenas uma coisa que precisamos corrigir, porque
‫neste momento este middleware está sendo
‫executado para find, mas não para find1.
‫OK?
‫Deixe-me mostrar o problema que podemos encontrar com isso.
‫Então, vamos fazer a identificação do tour secreto.
‫Portanto, temos a
‫Turnê Secreta aqui, e esse é o seu ID, e se fizermos a
‫turnê, isso deve nos dar a Turnê Super Secreta aqui.
‫Direito?
‫E então você vê,
‫aquele filtro que acabamos de construir no
‫middleware não está funcionando para este comando.
‫OK?
‫E isso porque a função de manipulação
‫dessa rota, como
‫você deve se lembrar, está usando findByID, que, nos bastidores,
‫é find1 e, portanto, é diferente de find.
‫Tudo bem?
‫Portanto, precisamos especificar o mesmo middleware também para find1.
‫Agora, existem duas maneiras
‫de fazer isso, e a primeira seria simplesmente
‫seguir em frente, copiar este código e, em seguida, colocar find1 aqui.
‫Mas isso não é muito
‫bom e, em vez disso, usaremos uma expressão regular.
‫E isso é bem fácil, e então ...
‫E deixe-me apenas duplicar isso
‫aqui, comentar esta
‫parte e, em seguida, lembre-se, uma expressão regular
‫começa e termina com uma barra.
‫E aqui, o que quero dizer,
‫é que este middleware
‫deve ser executado não apenas para
‫find, mas para todos os comandos que começam com o nome find.
‫OK?
‫Portanto, localize e localize1 e também localize e exclua, localize1 e
‫atualize, e todos
‫esses agora irão realmente acionar esta função
‫de middleware que temos aqui.
‫Tudo bem?
‫Então, não há necessidade disso.
‫Esta expressão regular aqui é muito melhor.
‫Então, novamente, isso
‫aqui significa simplesmente todas as strings que começam com find.
‫E, na verdade, já que estamos aqui,
‫deixe-me mostrar a vocês as documentações do Mongoose novamente.
‫Então, quando formos aqui para o middleware nestes guias, você terá uma
‫visão geral de todo o middleware.
‫Por exemplo,
‫middleware de documento é aquele de que falamos
‫antes, que é executado, por exemplo, ao salvar.
‫Mas, na verdade, o middleware de
‫documento também pode ser executado para coisas como remove.
‫Tudo bem?
‫Ou para validar.
‫Ok, mas eu não falei sobre
‫isso porque geralmente o que usamos sempre é apenas para salvar.
‫Agora, o middleware de consulta pode ser executado para
‫todas essas funções de consulta.
‫Portanto, encontre, como acabamos de especificar,
‫e agora, com nossa expressão
‫regular, ela também
‫será executada para find1,
‫findOneAndDelete, findOneAndRemove e findOneAndUpdate.
‫De qualquer forma, voltando ao Postman
‫agora, isso deve ter corrigido a situação aqui.
‫Portanto, quando agora executarmos essa consulta, ela
‫não deverá ter resultados.
‫E, de fato, não funciona.
‫Porque, lembre-se, estávamos tentando obter um SecretTour.
‫Portanto, o passeio com este ID aqui
‫é secreto, mas nunca queremos que
‫secretTours apareça em nenhuma consulta.
‫E é por isso que, agora, não obtemos nenhum resultado.
‫OK?
‫Então isso funciona agora.
‫Não salve isso, e
‫agora, de volta ao nosso código.
‫Vamos agora também
‫especificar um pós-middleware para find.
‫Então, tourSchema, e então, como antes, poste, e então vamos usar
‫nossa expressão regular aqui novamente para
‫qualquer coisa começando com find.
‫E então apenas
‫uma função regular, e aqui, no
‫middleware pós-localização, temos acesso a todos os
‫documentos que retornamos da consulta.
‫Então, vamos chamar isso de Docs.
‫Tudo bem?
‫Portanto, lembre-se de que este middleware será
‫executado após a consulta já ter sido executada.
‫E assim, portanto, poderá ter
‫acesso aos documentos que foram devolvidos.
‫Novamente, porque essa consulta na
‫verdade já foi concluída neste ponto.
‫Então, vamos registrar esses documentos no console,
‫então
‫docs, mas também quero fazer outra coisa aqui.
‫Então, basicamente, vamos criar uma espécie
‫de relógio para medir quanto tempo leva
‫para executar a consulta atual.
‫Tudo bem?
‫Então, como vamos fazer isso?
‫Bem, muito simples.
‫Podemos simplesmente definir uma propriedade para este objeto, porque
‫este objeto de consulta é, na verdade, apenas um objeto normal.
‫É claro que ele tem acesso a todos esses
‫métodos, como find,
‫mas também podemos usá-lo
‫para definir qualquer propriedade que quisermos nele.
‫Então, novamente, apenas um objeto normal.
‫E aqui podemos dizer isso. o início
‫deve ser a data atual.
‫OK?
‫E então isso definirá
‫como a hora atual em milissegundos, certo?
‫E então, aqui, no pós-middleware, que será executado
‫após a execução da consulta, podemos subtrair
‫a hora atual menos a
‫hora de início.
‫Então console. log, consulta
‫realizada e agora
‫a data atual menos
‫isso.
‫iniciar, milissegundos.
‫Ok, vamos salvar, e agora
‫vamos tentar executar uma consulta e ver nossos resultados.
‫OK?
‫Então, aqui temos todos os nossos tours,
‫aqui temos o
‫console e vamos esclarecer isso.
‫Há um monte de coisas lá.
‫Solicite novamente
‫e aqui estão todos os resultados.
‫Então, basicamente, esses são todos os passeios que foram encontrados, e
‫esse é o resultado do console. log dos documentos.
‫Então, basicamente, os documentos que correspondem à consulta.
‫Mas agora estou interessado neste primeiro console. log, e
‫então, aqui vemos "A consulta demorou 120 milissegundos" e foi
‫basicamente o tempo que passou
‫desde o início, onde definimos isso,
‫até depois que a consulta foi executada, neste momento.
‫Tudo bem.
‫E isso é tudo o que eu
‫tinha para mostrar a vocês
‫agora sobre middleware de
‫consulta e, assim como antes, é
‫claro que
‫usaremos isso muito ao longo do curso,
‫porque, como mencionei no início, middleware é realmente
‫um conceito fundamental isso é muito importante para
‫muitas coisas que precisamos em nossos aplicativos.
‫Então, estamos quase terminando de falar sobre middleware.
‫O próximo é o último, que
‫é o middleware de agregação.