‫Professor: Neste vídeo, vamos
‫agora criar uma classe de erro melhor e mais
‫útil, e também fazer algumas refatorações.
‫E começando com essa classe de erro,
‫vamos criar um novo arquivo em nossa pasta Utilities.
‫Então, novo arquivo, e vou chamá-lo
‫de AppError porque esse será o nome da classe, certo?
‫Então, classifique AppError, e realmente queremos que todos os nossos
‫objetos AppError sejam herdados do erro embutido
‫e, portanto, vamos estender a classe de erro embutido.
‫Então, usamos extends Error, ok?
‫Então, nós fizemos isso antes em algum
‫lugar neste curso, e novamente são apenas aulas ES6, certo?
‫Nesse caso, herança de
‫classe, onde uma classe herda da outra, certo?
‫Então, como sempre, nosso construtor, e
‫o que vamos passar para
‫um novo objeto criado a partir da
‫classe AppError, será a mensagem e o statusCode, então apenas
‫esses dois.
‫Ok, então, lembre-se de que o método construtor é
‫chamado cada vez que criamos um novo objeto desta classe.
‫Agora, como de costume, quando estendemos
‫uma classe pai, chamamos super para chamar o construtor
‫pai, certo, e fazemos isso
‫com mensagem porque a mensagem é na verdade
‫o único parâmetro que o erro embutido aceita.
‫Ok, então isso é basicamente você está chamando
‫o erro, certo, e então aqui
‫está o material
‫usual, definimos statusCode para statusCode, tudo bem, e agora
‫também queremos definir o próprio status.
‫Portanto, lembre-se que o status pode ser falha ou erro,
‫e poderíamos passar isso para o objeto,
‫mas também não é
‫realmente necessário, porque o status depende do statusCode.
‫Então, quando o statusCode for 400,
‫o status será
‫falha, e se for 500, será um erro, certo,
‫e isso simplesmente testa se
‫o statusCode começa com quatro.
‫Então, em JavaScript, há um método startsWith que podemos chamar em
‫strings, e então eu
‫acho que é a maneira mais fácil de
‫fazer este teste, e isso basicamente converte o statusCode em uma
‫string, e para isso estou simplesmente usando um string
‫de template com o código lá, então isso,
‫ou na verdade, podemos apenas usar statusCode.
‫Então, statusCode
‫e, em seguida, startsWith, aqui
‫também precisamos de uma string e, se statusCode
‫como uma string começar com quatro, bem, teremos uma falha.
‫E então aqui, vamos usar o ternário,
‫ok, então é falha quando começa
‫com quatro e, do contrário, é um erro, ok?
‫Então, muito simples, e isso já nos
‫poupa de ter que passar manualmente em falha ou erro.
‫Tudo bem, agora a seguir,
‫todos os erros que
‫criarmos usando essa classe serão todos erros operacionais.
‫Então, erros que podemos
‫prever vão acontecer em algum momento
‫no futuro, como por exemplo
‫um usuário criando um tour sem os campos obrigatórios, certo?
‫Então isso é um erro operacional, ok,
‫e novamente, de agora em diante,
‫sempre usaremos essa classe AppError aqui
‫que estamos criando agora
‫para criar todos os erros em nosso aplicativo.
‫E esses erros serão erros operacionais, então
‫o que vou fazer
‫agora é criar também um. é propriedade operacional aqui.
‫Então, é isso. está operacional
‫e defina-o como verdadeiro.
‫Portanto, todos os nossos erros
‫farão com que essa propriedade seja definida
‫como true, e estou
‫fazendo isso para que mais tarde possamos testar
‫essa propriedade e apenas enviar mensagens
‫de erro de volta ao cliente para esses
‫erros operacionais que criamos usando essa classe.
‫E isso é útil porque
‫alguns outros erros malucos inesperados que podem acontecer
‫em nosso aplicativo, por exemplo, um erro de
‫programação ou algum bug em um dos
‫pacotes que exigimos em nosso aplicativo,
‫e esses erros,
‫então, obviamente não terão isso. é uma propriedade
‫operacional neles, certo, e pode
‫parecer um pouco confuso
‫neste ponto, mas não se
‫preocupe, fará muito sentido quando
‫implementarmos aquela parte que acabei de mencionar.
‫Então, testando isso. é propriedade operacional aqui.
‫Tudo bem, e agora apenas uma
‫última etapa é que também precisamos capturar o rastreamento de pilha.
‫Agora, o que quero dizer com rastreamento de pilha?
‫E então, deixe-me mostrar isso para
‫você, então, mostrar o que é rastreamento de pilha,
‫e então eu irei registrá-lo aqui no console.
‫Console. log e erro. stackTrace,
‫então cada erro obtém esse rastreamento de pilha e,
‫na verdade, é apenas uma pilha, certo.
‫Então erre. pilha irá basicamente
‫nos mostrar onde o erro aconteceu.
‫Deixe-me executar isso
‫aqui agora, vamos dar uma
‫olhada nisso, e isso nos
‫dá aqui o erro e também onde aconteceu, ok?
‫Portanto, neste caso aqui, é
‫claro, adicione o aplicativo. js na linha 32.
‫Então, bem aqui.
‫Então, foi aí que
‫criamos esse erro, e agora
‫está em nosso rastreamento de pilha, e também nos
‫mostra toda a pilha de chamadas aqui, que no final se originou neste erro, ok?
‫Então, queremos preservar isso
‫e também, ao mesmo tempo, não adicionar esse método
‫aqui, ou essa classe, à trilha de pilha, certo?
‫E, novamente, isso parece um pouco
‫confuso, eu sei, mas neste
‫caso não é muito importante, tudo o que
‫importa é que apenas adicionamos esta linha de código
‫aqui, que é Error. capturestackTrace, então exatamente
‫o que você obtém aqui,
‫e primeiro precisamos especificar o objeto atual, que
‫é este, e então a própria classe AppError, que
‫será isso. construtor.
‫Ok, e desta forma, quando um novo objeto é
‫criado e uma função construtora é chamada, essa chamada
‫de função não aparecerá no
‫rastreamento de pilha e não o poluirá.
‫Tudo
‫bem, vamos colocá-lo aqui,
‫e sim, essa é nossa classe AppError,
‫e agora vamos realmente exportá-lo daqui.
‫Então, módulo. as exportações são, obviamente, o AppError.
‫Ótimo, apenas uma pergunta que você pode ter é 'Por
‫que não fiz isso. mensagem igual a mensagem? 'Bem, isso
‫é apenas porque aqui eu chamei a classe
‫pai, certo, e a classe pai é
‫o erro, e tudo o que passarmos para ela
‫será a propriedade da mensagem.
‫Assim como eu disse antes.
‫E então, basicamente, aqui, ao fazer esta chamada pai, já definimos a
‫propriedade da mensagem para a nossa
‫mensagem de entrada.
‫Tudo bem, salve-o e agora podemos fechá-lo, não
‫precisamos mais dele,
‫e aqui vamos apenas importá-lo aqui.
‫Const AppError,
‫require
‫e, em seguida,
‫está em utils, então Utilities e appError, ok, e
‫agora vamos realmente prosseguir e usá-lo.
‫Comente este trecho de código
‫e exclua o que tínhamos antes,
‫e isso criará
‫o erro bem aqui dentro do próximo.
‫Então, new AppError, e então
‫a mensagem, que é
‫esta, e o código
‫de status.
‫Certo, e a falha, lembre-se,
‫será então automaticamente descoberta, então vamos excluir tudo
‫isso, salvá-lo
‫aqui e mais uma vez, testar esta rota errada
‫e, de fato, ainda obteremos o mesmo
‫erro, e ainda obtemos exatamente o mesmo rastreamento de pilha.
‫Ok, e finalmente eu também
‫quero exportar este middleware aqui, ok?
‫Então, basicamente, esse manipulador, porque
‫no restante da seção, vamos construir
‫algumas funções diferentes para
‫lidar com diferentes tipos de erros e, portanto, quero
‫que todas essas
‫funções estejam todas no mesmo arquivo, certo?
‫E podemos dizer que todas essas funções
‫que acabei de mencionar são manipuladores, ok, e manipuladores,
‫também os chamamos de controladores no contexto
‫da arquitetura MVC e, portanto, agora vamos
‫criar um arquivo de
‫controlador de erro em nossa pasta de controladores.
‫Ok, e isso pode soar ou parecer um pouco estranho, porque na verdade
‫não temos um recurso de erro ok, então provavelmente
‫algumas pessoas vão discordar de mim que este é
‫o lugar correto, mas eu pessoalmente
‫gosto de fazer assim porque em no final
‫das contas, essas
‫funções, elas meio que servem mesmo para
‫controlar nossos erros, tudo bem, e então
‫para mim pelo menos faz sentido
‫simplesmente chamar essa função aqui de controlador de erro, e aqui
‫eu queria colar aquela função de middleware , mas acho que
‫não copiei, então vamos fazer isso de novo.
‫Tudo bem, então, na verdade, irei exportar este
‫aqui como o módulo. exporta porque
‫as outras funções
‫de manipulação que iremos
‫criar mais tarde, não as exportarei daqui.
‫Então, eles vão ser apenas ajudantes.
‫Então, módulo. exportações são iguais a esta função, ok?
‫Vamos nos livrar deste console. log aqui, salve-o
‫e agora de volta ao nosso aplicativo, é
‫claro que agora precisamos conectar essa
‫função de middleware aqui.
‫Então, vamos novamente prosseguir e importá-lo
‫e eu posso chamá-lo
‫do
‫que eu quiser, então
‫deixe-me chamá-lo de globalErrorHandler com
‫H maiúsculo,
‫e irei requerer controladores e errorController.
‫Coloque-o de volta aqui, e agora para o teste
‫final após esta refatoração.
‫Vamos ver, e de fato
‫mais uma vez, tudo funciona bem, ok?
‫Então, perfeito, esse era o objetivo desse vídeo, até
‫o próximo.