‫Instrutor: Assim como o
‫Express, o Mongoose também possui o conceito de middleware.
‫E agora vamos aprender sobre o
‫primeiro tipo de middleware, que é o middleware de documento.
‫Agora, assim como no Express, podemos usar
‫o middleware Mongoose para fazer algo acontecer
‫entre dois eventos.
‫Por exemplo, cada vez que um novo documento
‫é salvo no banco de dados, podemos
‫executar uma função entre o comando salvar e o
‫salvamento real do documento, ou também após o salvamento real.
‫E essa é a razão pela qual
‫o middleware Mongoose também é chamado de pré e pós-ganchos.
‫Então, novamente, porque podemos definir funções para
‫serem executadas antes ou depois de um determinado evento, como salvar
‫um documento no banco de dados.
‫Portanto, o middleware é um conceito absolutamente fundamental no
‫Mongoose, assim como no Express.
‫E há inúmeras possibilidades
‫e casos de uso para middleware, e
‫vamos usar middleware o tempo todo neste projeto.
‫Portanto, há quatro tipos de middleware
‫no Mongoose: middleware de documento, consulta, agregação e modelo.
‫E nesta palestra, vamos
‫falar sobre middleware de documento, que
‫é o middleware que pode atuar no documento processado atualmente.
‫Portanto, assim como as propriedades virtuais,
‫definimos um middleware no esquema,
‫portanto, tourSchema. pré.
‫E isso é para middleware pré, que novamente,
‫será executado antes de um evento real.
‫E esse evento, neste caso, é o evento de salvamento.
‫E então esta função de retorno de
‫chamada que iremos definir
‫aqui a
‫seguir, então funcione para que esta função seja chamada antes de um documento
‫real ser salvo no banco de dados.
‫Portanto, este é um middleware de documento e é
‫executado, deixe-me escrever tudo isso aqui.
‫Portanto, ele é executado antes do comando
‫save e do. criar o comando.
‫Mas não na inserção de muitos.
‫Portanto, se usarmos este comando aqui, insertMany, isso não irá
‫realmente acionar o middleware de salvamento.
‫Portanto, sempre tenha isso em mente.
‫É muito importante perceber que somente ao
‫salvar e criar o middleware aqui
‫será executado.
‫E então vamos começar fazendo um console simples. log e o que
‫vou registrar por meio do console é o seguinte.
‫E assim, em um middleware salvo, a palavra-chave de disco
‫aqui vai apontar para o documento processado atualmente.
‫E é por isso que é chamado de middleware de documento.
‫Novamente, porque nesta função
‫aqui, temos acesso ao documento que está sendo processado.
‫Portanto, neste caso, o documento que está sendo salvo.
‫E deixe-me mostrar isso rapidamente para você usando
‫este console. registro.
‫E então, para acionar agora esta função,
‫lembre-se de que precisamos executar um comando de salvamento ou um comando de criação.
‫E agora precisamos criar um novo tour usando
‫nossa API para, sim, acionar este middleware.
‫Então, vamos aqui para, para o carteiro, e vou começar salvando
‫essas duas novas rotas que criamos
‫nas palestras anteriores, então pegue um plano mensal.
‫E este aqui é obter estatísticas do tour.
‫Agora posso fechá-los e criar um novo tour.
‫E especificamos os dados aqui no corpo.
‫Agora, nem todas as coisas aqui são realmente necessárias, então
‫vamos dar uma olhada no que realmente é
‫necessário e nos livrar do resto.
‫Portanto, o imageCover é necessário,
‫o resumo, é claro o preço, e sim.
‫Então, vamos nos livrar do que
‫realmente não precisamos aqui, apenas para mantê-lo no mínimo.
‫Então, as avaliações, quantidade, média, então isso
‫não é necessário.
‫Então, vou chamar este
‫aqui de tour de teste, apenas para mantê-lo bem simples aqui.
‫Agora vamos enviar essa solicitação e, de fato, ele criou
‫o novo documento e agora vamos dar
‫uma olhada em nosso console e ver esse documento aqui.
‫E, de fato, aqui está.
‫Então, vamos aumentar isso aqui um
‫pouco e é assim que nosso documento
‫está antes de ser salvo no banco de dados.
‫E então aqui temos as classificações média e quantidade,
‫que são definidas por padrão.
‫Lembre-se, então, 4. 5 e zero, e
‫então o timestamp criadoAt, e você pode até
‫ver a propriedade virtual que definimos aqui.
‫Então, novamente, isso é certo antes de realmente salvarmos
‫esses dados no banco de dados.
‫E então, neste ponto do
‫tempo, ainda podemos agir sobre os dados antes que eles sejam salvos
‫no banco de dados e é exatamente o
‫que faremos agora.
‫Então, aqui em nossa função de middleware.
‫E o que eu quero fazer aqui é criar
‫um slug para cada um desses documentos.
‫Portanto, lembre-se de como, na primeira
‫seção, criamos um slug para cada um dos
‫produtos que tínhamos na loja.
‫E então um slug é basicamente apenas
‫uma string que podemos colocar na URL, geralmente com base em
‫alguma string como o nome.
‫Nesse caso, vamos criar um slug baseado
‫aqui no nome do tour.
‫Então lembre-se de como usamos o pacote slugify.
‫E agora vamos instalá-lo.
‫Tudo bem, enquanto isso,
‫vamos prosseguir e exigir isso aqui.
‫Portanto, exija slugify.
‫Vamos voltar à nossa primeira janela aqui, na verdade.
‫E agora, aqui embaixo, não queremos
‫mais registrar isso no console.
‫Mas, em vez disso, agora podemos dizer isso e,
‫lembre-se, este é o documento processado atualmente.
‫Portanto, agora podemos definir uma nova propriedade nele.
‫E é exatamente isso que estou fazendo.
‫Então, é isso. slug deve ser slugify, e
‫então apenas uma string a partir da
‫qual queremos criar um slug, e assim será. nome e depois também queremos passar
‫a opção de que
‫tudo deve ser convertido para minúsculo,
‫e isso é menor: verdadeiro, e agora vou salvá-lo.
‫E uma coisa que ainda
‫não falamos é a próxima função.
‫Assim como no Express, também temos a próxima função no
‫middleware mMngoose, basicamente para chamar o próximo
‫middleware na pilha como já sabemos.
‫Agora, neste caso, temos apenas uma função de middleware, e
‫é por isso que não encontramos nenhum
‫problema, nem mesmo chamando em seguida, mas vamos fazer isso agora.
‫E assim, cada função de middleware,
‫em um middleware pré-salvo, tem acesso ao próximo.
‫Isso é exatamente o mesmo que no Express
‫e, ao final do middleware, chamamos next, e
‫isso chamará o próximo middleware
‫na pilha.
‫Então, vamos tentar novamente.
‫E isso será chamado de tour de teste número dois.
‫Muito simples, mande para o
‫céu, e vamos aguardar.
‫E agora, por algum motivo, não está realmente aqui.
‫Vamos ver se obtivemos algum
‫erro e realmente não.
‫Mas o motivo pelo qual não está
‫funcionando é que agora não temos nenhum slug em nosso esquema.
‫E lembre-se de que isso realmente aconteceu conosco antes,
‫quando tínhamos apenas alguns campos no esquema.
‫E quando definirmos alguns campos
‫que não estavam no esquema, eles
‫simplesmente não persistiram no banco de dados.
‫E a mesma coisa está acontecendo agora,
‫então definimos a propriedade slug, mas não está em nosso esquema.
‫E, portanto, não foi salvo no banco de dados, então
‫vamos corrigir isso rapidamente e vamos colocá-lo, oh,
‫não sei, não importa muito, pode colocá-lo
‫aqui logo após o
‫nome, então o slug deve simplesmente seja uma string.
‫E isso deve consertar.
‫Portanto, vamos voltar e criar o tour de teste número três.
‫Porque não pode ser o mesmo, porque lembre-se que
‫não podemos ter passeios com o mesmo nome.
‫Então, faça novamente, e agora de fato temos a propriedade slug
‫bem aqui e ela é baseada no nome, como você
‫pode ver aqui.
‫Ótimo, então vamos voltar aqui, vamos reduzir
‫isso um pouco.
‫E aqui temos o middleware de pré-documento.
‫Agora vamos experimentar rapidamente, também,
‫um pós-middleware.
‫Então tourSchema. postar e usar salvar novamente.
‫E depois a função de callback, que no caso
‫do post middleware tem acesso
‫não só ao próximo, mas também ao documento
‫que acabou de ser salvo no banco de dados.
‫Então, vamos chamá-lo de doc e depois o próximo.
‫E assim as funções pós-middleware são
‫executadas depois que todas as funções pré-middleware
‫foram concluídas, tudo bem.
‫Portanto, aqui, na verdade, não temos mais a palavra-chave disk,
‫mas em vez disso, temos o documento
‫basicamente concluído aqui no doc.
‫Então, vamos apenas registrar esse documento concluído no console
‫e, em seguida, chamar em seguida.
‫Agora, neste caso novamente, temos
‫apenas um post middleware e, portanto, não precisaríamos realmente
‫do próximo, mas é uma prática recomendada simplesmente sempre incluí-lo.
‫Agora outra coisa que eu queria mostrar a vocês
‫é que podemos ter, é
‫claro, vários pré-middlewares ou também pós-middlewares para o mesmo gancho.
‫E gancho é o que chamamos de salvar aqui.
‫Portanto, esse middleware aqui é basicamente
‫o que chamamos de gancho de pré-salvamento.
‫Portanto, você verá essa terminologia o tempo todo.
‫Portanto, alguns o chamam de middleware e outros de ganchos.
‫E então este será um gancho de
‫pré-salvamento ou middleware pré-salvamento.
‫Então funcione, e este tem acesso ao próximo.
‫E então vamos apenas registrar
‫algo no console aqui, como salvará o documento.
‫E então o próximo, e é claro, deve ser o próximo.
‫Só para ver se obtemos
‫algum erro, vou omitir o próximo aqui.
‫Só para ver o que acontece quando não ligamos.
‫Vou criar um novo
‫tour e, ao final desta palestra,
‫vou deletar todos eles, mas por enquanto precisamos deles aqui.
‫E agora você vê que não está realmente terminando, então
‫estamos presos naquela função de middleware que não
‫tem a próxima chamada.
‫Então, basicamente, estamos presos aqui.
‫Portanto, vamos cancelar a
‫solicitação e, em seguida, recuperá-la aqui e
‫tentar novamente.
‫E agora funcionou de fato.
‫Então, nosso slug está aqui, certo, vamos dar uma
‫olhada em nosso console e, de fato,
‫nosso segundo middleware pré também é executado, então
‫o registro salvará o documento e, em
‫seguida, nosso middleware pós-logado no console o documento final,
‫e isso também já
‫deve ter a lesma e sim, aqui está.
‫E isso é tudo o que eu
‫tinha para mostrar a você sobre o middleware de documentos.
‫Agora vou comentar esses dois aqui porque
‫não quero poluir meu log aqui o tempo todo com
‫esses console. logs, mas ainda
‫estou mantendo-os aqui, novamente, como
‫uma referência.
‫Então, o que quero que você lembre desta palestra é
‫que podemos ter o middleware em execução antes e
‫depois de um determinado evento.
‫E, no caso de middleware de
‫documento, esse evento geralmente é o evento de salvamento.
‫E então, na função de middleware em si, temos
‫acesso à palavra-chave do disco,
‫que vai apontar para o documento que está sendo salvo.
‫E também é muito importante ter
‫em mente que este middleware de salvamento só é executado para os métodos de
‫salvamento e criação do Mongoose.
‫Não vai rodar, por exemplo, para inserir muitos
‫e também não para localizar e atualizar
‫ou localizar por ID e atualizar, que já usamos antes.
‫Por exemplo, em algum lugar aqui
‫temos findByIdAndUpdate, mas isso não irá acionar este
‫middleware de salvamento.
‫Portanto, isso é muito importante ter em mente
‫porque, na verdade, um
‫pouco mais adiante neste projeto, teremos que contornar essa limitação.
‫Tudo bem, então este é um
‫middleware de documento para manipular documentos que estão sendo salvos no momento.
‫A seguir, vamos falar sobre middleware de consulta.