‫Instrutor: Agora vamos fazer
‫mais uso de nosso negócio de
‫classe AppError, adicionando alguns erros 404 e algumas
‫de nossas funções de manipulador de tour.
‫Agora, apenas uma coisa que
‫eu queria dizer antes de realmente implementarmos esses
‫erros 404 é que, claro, poderíamos ter usado a
‫função catchAsync também em nosso roteador, certo?
‫Então, deixe-me mostrar como isso funcionaria.
‫Então, aqui em
‫TourRoutes, eu poderia ter
‫agrupado essa função aqui em catchAsync assim,
‫em vez de fazer aqui no controlador.
‫Então, aqui onde eu fiz de fato, certo?
‫E isso teria exatamente o mesmo resultado,
‫mas eu não
‫fiz dessa maneira porque assim, tenho
‫que lembrar qual desses métodos
‫aqui é realmente um método
‫de sincronização, ok, de modo que
‫apenas nesses eu realmente adiciono a função catchAsync , direito?
‫Agora, neste caso, na verdade, todos eles são funções
‫assíncronas e, portanto, não é esse o problema aqui neste
‫exemplo, mas haverá alguns exemplos
‫mais tarde em que nem todos os manipuladores são funções
‫assíncronas e,
‫nesse caso, eu realmente teria
‫para lembrar qual deles eu tenho que envolver
‫em catchAsync e
‫quais não e então, fazer
‫isso no controlador é muito mais fácil porque simplesmente cada
‫vez que estou escrevendo
‫uma função assíncrona aqui,
‫eles já sabem bem, preciso embrulhar em catchAsync.
‫OK.
‫Então, eu não estou
‫fazendo isso aqui, eu apenas faço como mostrei no último vídeo.
‫Ok, na verdade, uma vez encontrei um bug que
‫era muito difícil
‫de encontrar porque eu envolvi
‫uma função que não era assíncrona em
‫catchAsync e então não estávamos
‫funcionando e não consegui descobrir onde estava
‫o bug e desperdicei muito tempo naquele.
‫E assim, desde então, não coloquei mais catchAsync aqui, mas
‫muito perto de onde eu realmente
‫preciso, tão perto do código que é realmente assíncrono.
‫Ok, com isso
‫dito, vamos implementar alguns erros 404 aqui.
‫Tudo bem, então eu
‫quero começar mostrando a vocês novamente
‫o exemplo que fizemos no último vídeo.
‫Ok, então tentamos fazer um tour
‫por esse ID estranho que realmente não existe e
‫o erro
‫que obtivemos é que basicamente o
‫Mongoose não conseguiu converter essa string
‫aqui em um ID válido para o MongoDB.
‫Mas o que acontece quando realmente usamos um ID válido do MongoDB?
‫Então, por exemplo, vamos, sim, vamos copiar este
‫aqui, ok,
‫e este obviamente terá um resultado e
‫então, vamos apenas alterá-lo ligeiramente, então por exemplo,
‫alterar isso para zero aqui ainda
‫será um ID válido , então
‫fica assim e
‫é exatamente o mesmo de
‫antes, eu apenas
‫alterei um número, mas esse ID provavelmente não existirá.
‫E então, vamos ver o que temos então.
‫E, de fato, agora nosso resultado aqui é nulo.
‫Tudo bem, então, não é isso que queremos, é?
‫O que queremos aqui é mostrar um código de status 404 aqui e
‫dizer que este tour não foi encontrado.
‫Ok e então, vamos agora usar a classe
‫orAppError para implementar isso.
‫Lembre-se de que o
‫passeio que faremos de volta aqui é nulo, certo?
‫Então, null que agora podemos testar.
‫Então, se formos para o nosso manipulador
‫getTour, vamos agora implementar se não houver tour e nesse caso iremos criar
‫ou erro e isso aqui funciona
‫porque
‫se não houver
‫tour, será nulo.
‫Lembre-se de que, em JavaScript, nulo é um valor falácia, portanto,
‫um valor que será convertido em falso aqui
‫em uma instrução if.
‫Ok, e então, se não houver
‫um tour, então
‫o tour é falso e não falso
‫é claro, é assim que entramos neste bloco if.
‫Então, o que queremos fazer se não houver turnê?
‫Bem, queremos criar o próximo com um erro.
‫Então, para pular direto para o erro e o
‫middleware vinculado.
‫Então, fazemos um novo AppError que ainda
‫não está disponível, ainda temos
‫que importá-lo, mas vamos usá-lo aqui imediatamente.
‫Ok, digamos que
‫nenhum tour foi encontrado com esse ID.
‫E então um código
‫de status, lembre-se de que o segundo argumento é 404, certo?
‫Agora, uma última coisa que precisamos
‫fazer aqui é dizer return, ok porque queremos
‫retornar esta função imediatamente e não passar
‫para a próxima linha que seria esta
‫e que
‫basicamente tentaria enviar duas respostas e nós já se deparou com
‫esse erro antes, então espero que
‫você se lembre disso
‫e é por isso que sempre precisamos retornar aqui.
‫Ok, vamos agora importar rapidamente o appError e isso é
‫semelhante a este aqui, então
‫vamos apenas duplicar.
‫Ok, e aqui está na verdade com A maiúsculo.
‫Tudo bem, salve e
‫vamos tentar novamente
‫e agora nenhum tour foi encontrado com esse ID 404.
‫Perfeito, então exatamente o que queríamos.
‫Ah, e você também viu que falhamos aqui.
‫Ok e isso também vem de ou da classe.
‫Ótimo, isso funciona e eu realmente espero
‫que agora você tenha entendido exatamente como todo esse
‫tratamento de erros funciona.
‫Ok, então novamente criamos um erro e então passamos
‫esse erro para o próximo e
‫assim que o next receber algo, ele
‫assume que é um erro
‫e vai
‫direto para o middleware de tratamento de erros
‫global que enviará a resposta para nós , OK?
‫Então, vamos copiar
‫este e colocá-lo em todos os outros
‫manipuladores que consultam documentos com base no ID.
‫Então, não crie um tour, mas atualize um tour, ok?
‫E assim,
‫aqui mesmo, se estivermos tentando atualizar
‫o tour que não
‫existe, ele nos dará exatamente o mesmo erro.
‫Finalmente, é claro, o mesmo com delete.
‫E agora você vê que o ESLint me deu esse erro
‫aqui e então, isso é porque esse tour não
‫está definido e, neste caso, o ESLint realmente me salvou
‫aqui de criar esse bug.
‫Direito?
‫Então, novamente sem o ESLint, eu
‫provavelmente teria apenas colado aqui
‫e encerrado o
‫dia sem nem perceber que o tour não está
‫definido em nenhum lugar
‫dentro desta função, mas como instalamos essa ferramenta realmente valiosa,
‫posso ir em frente e consertá-la.
‫Tudo bem, então até
‫este ponto, nós simplesmente aguardamos esta instrução de exclusão aqui e não salvamos
‫o resultado dela e isso
‫é simplesmente porque não precisávamos dela.
‫Ok, mas agora realmente precisamos dela porque queremos
‫esta variável de passeio a
‫fim de verificar se realmente existe um passeio ou não.
‫Então, muito fácil, const tour e igual
‫a esse resultado, salve
‫e aí o erro vai embora.
‫Tão bom.
‫ESLint no trabalho, certo?
‫Agora, talvez você tenha percebido que não adicionei esse erro 404
‫aqui neste manipulador getAllTour.
‫Então, por que eu fiz isso?
‫E então deixe-me explicar por quê.
‫Então, quando nenhum resultado foi encontrado, por
‫exemplo, não há resultados correspondentes para um filtro, ou porque a
‫página solicitada que não
‫existe, é claro que podemos considerar o envio de
‫um erro 404 e dizer que os
‫dados não foram encontrado, mas na minha
‫opinião e também na opinião de outros
‫desenvolvedores, isso não é totalmente correto neste pedido porque
‫não houve realmente um erro.
‫Quer dizer, o pedido foi recebido corretamente.
‫O banco de dados pesquisou corretamente os passeios
‫e encontrou exatamente zero registros e, portanto,
‫esses zero registros são exatamente
‫o que iremos enviar de volta junto com o código HTTP 200.
‫Tudo bem, então, novamente, considero que
‫não pode realmente haver um erro quando
‫um usuário solicita todos os passeios, a menos
‫que, é claro, haja alguma falha no banco de dados
‫ou algo parecido.
‫Mas, nesse caso,
‫o Mongoose lançará automaticamente um erro.
‫Certo, que por sua vez será capturado por nossa
‫função ou catchAsync e, como
‫você já sabe, manipulado
‫em nosso manipulador de erros global e, como você
‫já sabe,
‫manipulado em nosso middleware de gerenciamento de erros global.
‫Tudo bem, então eu já disse essas palavras tantas vezes agora.
‫De qualquer forma, espero que
‫tenha feito sentido e então, sim, vamos seguir em frente.