‫-: Neste vídeo, vamos criar um
‫tipo especial de middleware chamado param middleware.
‫Portanto, o param middleware é um middleware que só
‫roda para determinados parâmetros, basicamente,
‫quando temos um determinado parâmetro em nossa URL.
‫Agora, em nosso exemplo aqui, o
‫único parâmetro que podemos ter em nosso URL de rota é o id, certo?
‫E para que possamos escrever um
‫middleware que só seja executado quando esse id
‫estiver presente na URL, ok, deixe-me mostrar como fazer isso.
‫Na verdade, é bem simples, então está
‫no nosso roteador e depois no método param, ok.
‫E aqui especificamos primeiro o parâmetro que realmente
‫queremos pesquisar, basicamente o parâmetro para o
‫qual esse middleware será
‫executado e é chamado de id e, em seguida,
‫é claro, nossa função de middleware real.
‫E, como de costume, temos acesso à solicitação e
‫ao objeto de resposta,
‫e então percebemos uma função de
‫middleware também para a próxima função, certo?
‫Agora, em uma função
‫de middleware param, temos acesso a um quarto argumento
‫e esse é o valor do parâmetro em questão.
‫Então, normalmente chamamos aquele val, que significa valor.
‫E agora podemos ir em frente
‫e simplesmente registrá-lo no
‫console, apenas para ver se isso realmente funciona, digamos que o Tour
‫id é e depois o id, certo?
‫A seguir, também temos que ligar em seguida, certo?
‫Porque, caso contrário, o ciclo de resposta
‫de solicitação ficará preso nesta função
‫de middleware e não será capaz de
‫passar para o próximo middleware na pilha, certo?
‫Quais serão essas rotas aqui embaixo.
‫Tudo bem, então vamos salvá-lo e verificar agora.
‫E não queremos
‫todos os usuários, mas um tour, certo?
‫Bem, deixe-me mostrar
‫primeiro o que acontece se não tivermos nenhum id, ok, e
‫agora, não vemos nenhum registro em nosso console.
‫Mas se agora enviei a mesma solicitação
‫nesta rota em que temos o id, vamos ver o que acontece então.
‫Oh, isso me diz que id não está
‫definido, e de fato não é id, então isso foi um erro estúpido.
‫Então é val para valor, certo?
‫Portanto, lembre-se de como eu disse que esse parâmetro
‫de valor é o
‫que realmente conterá o valor do parâmetro id
‫e, claro, é o que precisamos usar
‫aqui para obter acesso a esse id.
‫Então, vamos tentar de novo, e agora
‫realmente temos o ID do Tour dois, certo?
‫Então esse log veio direto desta função aqui.
‫Agora, o que também quero
‫mostrar a vocês é que essa função de
‫middleware não será executada para nenhuma das rotas do usuário.
‫Digamos que chamemos um usuário com um id específico,
‫então vamos copiar este aqui,
‫criar uma nova requisição com um id e
‫deixar-me salvá-lo também.
‫Então pegue o usuário e salve para o usuário, e quando eu enviar aqui,
‫claro, obteremos nossa resposta padrão
‫desta rota não definida, mas você também verá
‫que não temos nenhum log como tínhamos antes.
‫E isso é claro porque essa função de middleware é
‫especificada apenas em nosso roteador de tour.
‫Nesse tipo de miniaplicativo local, novamente,
‫essa é a analogia que gosto de fazer.
‫Então, basicamente, cada roteador
‫é uma espécie de mini subaplicativo, um para cada recurso.
‫E, portanto, como esse middleware é especificado apenas neste
‫roteador, bem, é claro,
‫ele é apenas parte da
‫pilha de middleware se estivermos realmente dentro deste subaplicativo.
‫Faz sentido?
‫Então, vamos supor que temos uma solicitação de entrada em tours / id.
‫Essa solicitação passará por todos esses middleware, primeiro este
‫middleware, depois este, então este middleware, então
‫este, então todos eles fazem parte da pilha
‫de middleware e então ele finalmente
‫atingirá este middleware e já que
‫este é na verdade,
‫a rota, ele entrará no middleware tourRouter.
‫Ok, então a partir daí ele vai direto para o
‫middleware, e então este código será executado.
‫E, novamente, isso é apenas porque tem um id na rota.
‫Se não, bem, então isso seria simplesmente ignorado
‫e passaria direto para o
‫próximo middleware na pilha, então esses aqui embaixo, certo?
‫Legal, então é assim que o param middleware funciona; mas
‫por enquanto não é realmente útil.
‫Mas podemos realmente usá-lo para
‫um caso de uso muito prático aqui.
‫Então, vamos para nossas funções de manipulador aqui e
‫você verá que em todas as funções de
‫manipulador que realmente usam o id, verificamos se o id é válido.
‫Então, fazemos isso aqui em get tour e
‫também fazemos em update tour, aqui, e em delete tour.
‫Portanto, todas essas três funções têm esse código muito semelhante,
‫onde verificam se o id é
‫válido e, se não, enviam de volta essa resposta de ID inválido.
‫Portanto, temos todo esse código no mesmo
‫lugar e como você já sabe, não é uma
‫boa prática repetir o código e, portanto, o que
‫podemos fazer aqui é usar o conceito de
‫middleware param; e execute essa verificação aqui em um middleware
‫externo que será executado antes
‫mesmo que a solicitação atinja essas funções do manipulador.
‫Então, vamos copiar ou cortar o
‫código a partir daqui e criar uma nova
‫função de middleware chamada checkID e, claro, também preciso exportá-la.
‫Portanto, checkID e temos acesso, solicitação, resposta, em seguida, e
‫novamente, lembre-se de que é um middleware de
‫parâmetro e, portanto, o quarto argumento será
‫o valor do parâmetro.
‫Ok, cole aqui e depois não
‫se esqueça de chamar o próximo no final do middleware, certo?
‫E o que também é muito
‫importante é que temos essa instrução de retorno
‫aqui, porque se não tivéssemos esse retorno
‫aqui, bem, o express enviaria essa resposta de volta, mas
‫ainda continuaria executando
‫o código nesta função.
‫E assim, depois de
‫enviar a resposta, ele ainda atingirá a
‫próxima função e passará para o
‫próximo middleware e enviará outra resposta ao cliente.
‫Mas isso realmente não é permitido,
‫então lembre-se de que já nos deparamos com esse erro antes,
‫que nos dizia que não tínhamos permissão
‫para enviar cabeçalhos depois que a resposta já havia sido enviada.
‫E esse é
‫o tipo de erro que teríamos
‫se não tivéssemos essa instrução return, certo.
‫Portanto, novamente, apenas certifique-se de que, após enviar esta
‫resposta, a função retornará para que
‫ela seja concluída e nunca mais a chame.
‫Portanto, nunca se esqueça disso, mas é
‫claro que faremos isso
‫várias vezes durante o resto do
‫curso e você se acostumará com esse tipo de padrão.
‫Então, vamos remover esse código repetido de todas essas
‫outras funções, então
‫aqui está de novo, e sim.
‫Também quero esse código aqui apenas para
‫ter certeza de que a
‫função está realmente em execução, e tudo bem, agora podemos nos livrar
‫disso aqui e substituí-lo por nossa função de controlador recém-criada.
‫TourController, checkID,
‫vamos verificar isso agora,
‫e bem de novo, apenas para ter certeza
‫de que não
‫é executado onde não temos um id, portanto, não temos log
‫aqui, então tudo ainda está funcionando nesse lado.
‫E agora faça o tour com uma id
‫regular, então uma id válida, e então vamos ver.
‫Bem, obtemos que o Tour id é log,
‫e isso significa que se
‫ele realmente executou nosso middleware checkID, certo?
‫E se agora tentarmos um
‫id inválido, obteremos nossa mensagem de ID
‫inválido, o código de erro 404 e, claro, nosso id de tour.
‫Vamos fazer o mesmo com o
‫patch, já temos um
‫ID inválido aqui e ele também roda neste.
‫Então, perfeito, certo?
‫Portanto, não temos mais o código checkID no
‫manipulador de atualização que acabamos de invocar basicamente, mas ainda
‫assim nosso ID é verificado
‫porque temos esse middleware, então isso aqui.
‫Temos esse middleware na pilha
‫antes de realmente atingir o tourController de atualização.
‫Portanto, este middleware agora faz parte do nosso pipeline
‫como você pode imaginar, agora você pode
‫argumentar que podemos simplesmente criar uma
‫função simples que também pode
‫verificar o ID e eu chamo essa
‫função dentro de cada uma dessas funções de passeio e,
‫em seguida, chamo dentro de cada um desses controladores de turismo
‫relevantes; mas isso
‫realmente iria contra a filosofia do express, onde devemos
‫sempre trabalhar com a pilha de middleware, portanto,
‫com esse pipeline o máximo que pudermos, ok, e essas funções aqui,
‫eles não precisam se preocupar com a validação.
‫Cada uma dessas funções tem apenas um propósito que
‫é fazer o que dizem,
‫então esta apenas obtém
‫o passeio, esta apenas cria um passeio, esta apenas
‫atualiza e esta apenas exclui, não verifica, não
‫não precisa se preocupar com nada disso.
‫E se agora adicionarmos
‫outro controlador aqui também dependendo do id, então isso
‫também verificará automaticamente se o id é
‫inválido sem que tenhamos que fazer quaisquer etapas adicionais.
‫Isso irá verificar automaticamente o id e
‫isso é realmente útil e também como os
‫aplicativos expressos devem funcionar, ótimo.
‫Portanto, temos outra ferramenta em nossa caixa de ferramentas expresso que
‫agora podemos usar para escrever nossos aplicativos expresso.