‫-: Como mencionei no último
‫vídeo, existem três tipos de erros
‫que podem ser criados pelo Mongoose
‫nos quais precisamos marcar como erros operacionais para
‫que possamos enviar mensagens de erro significativas aos
‫clientes em produção.
‫E agora vamos começar simulando esses três erros, ok?
‫Então, a primeira é quando tentamos um ID inválido aqui, simplesmente
‫algo como isso, e
‫o Mongoose não será capaz de converter isso
‫em um ID do MongoDB, lembre-se disso.
‫E esse é o erro que temos agora e, na
‫verdade, aqui você pode ver todo o
‫tipo de coisa que definimos que queríamos ver nas produções.
‫Então, todo o objeto de erro, a mensagem de
‫erro e também a pilha completa, certo?
‫E, portanto, este é um exemplo perfeito de
‫um erro operacional.
‫Portanto, isso é algo que pode muito bem
‫acontecer e, portanto, precisamos enviar de volta uma resposta
‫significativa para lidar com esse erro.
‫E este é um exemplo perfeito de um erro operacional que
‫é muito provável que em algum momento aconteça com um cliente, então, precisamos
‫lidar com isso como um só, certo?
‫Então, basicamente enviando uma bela mensagem de
‫erro ao invés de algo
‫assim, que não significa nada para nenhum cliente, certo?
‫Ok, então o objetivo aqui
‫novamente será basicamente marcar esse erro como operacional
‫e criar uma mensagem significativa, certo?
‫Mas antes de fazermos isso,
‫vamos dar uma olhada nos outros
‫dois erros do Mongoose que também teremos que marcar como operacionais, certo?
‫Então, vamos criar um
‫novo passeio, e o que farei é criar um nome duplicado.
‫Então, vamos apenas copiar este aqui.
‫E acho que todos os valores
‫aqui estão corretos, então vamos tentar isso agora.
‫E de fato, aqui temos o erro que já conhecemos, que
‫é um erro de
‫chave duplicada porque já temos
‫um tour, ou um documento com o nome de Forest Hiker, ok?
‫Então, novamente, este é um
‫erro que vai acontecer em algum
‫momento e, novamente,
‫não há uma mensagem de erro muito significativa, certo?
‫E então, novamente, precisamos mudar isso.
‫O terceiro também é sobre validação,
‫então vamos fazer isso aqui no Tour de atualização.
‫Então, digamos que queremos uma média de avaliações de seis,
‫que sabemos que é inválida, certo?
‫Porque dissemos que o máximo de ratingsA Average
‫pode ser cinco.
‫Então, vamos
‫ver, e de fato, temos esse ValidationError, certo?
‫Então é chamado de ValidationError,
‫e tem esse objeto de erros com todos os erros.
‫Vamos colocar outro aqui.
‫Digamos dificuldade e,
‫em seguida, algo mais,
‫que não seja fácil, médio ou
‫difícil, e agora temos esses dois objetos aqui.
‫Um para as classificações e outro para a dificuldade, certo?
‫Esses são os
‫três erros que vamos
‫marcar como operacionais, começando com
‫o primeiro, basicamente, o tipo CastError, certo?
‫Então, vamos voltar aqui, e vamos fazer
‫isso aqui, de novo, porque só queremos fazer isso na produção, ok?
‫No desenvolvimento, não nos importamos com nada disso.
‫Tudo o que queremos fazer
‫é ver nossos erros para que possamos basicamente
‫corrigi-los, mas na produção, é aqui que
‫queremos enviar as mensagens de erro significativas aos clientes.
‫Então, vamos dizer se errar. name é igual
‫a CastError, então é assim que vamos identificar esse
‫tipo de erro aqui
‫que acabamos de falar,
‫pois tem o nome de CastError, certo?
‫Então, se errar. O nome
‫é CastError, bem, então vamos chamar uma função especial que criaremos
‫em um segundo,
‫que é chamada de handleCastError.
‫E então também direi aqui DB para banco de dados,
‫para que saibamos que isso está relacionado ao nosso banco de dados, ok?
‫E é assim que vai funcionar.
‫Vamos passar o
‫erro que o Mongoose criou
‫nesta função, assim, e isso irá
‫retornar um novo erro criado sem a classe AppError, ok?
‫E esse erro será marcado como operacional, porque
‫lembre-se, todos os nossos AppErrors
‫têm as propriedades
‫operacionais definidas para dois automaticamente, certo?
‫Portanto, isso retornará um erro e, então, vamos salvar isso, ok?
‫E assim estávamos salvando isso em err.
‫Agora não é uma
‫boa prática substituir os argumentos de uma função, certo?
‫Portanto, o erro vem dessa função de erro do meio, certo?
‫Então, a partir daqui, e em vez de
‫fazer isso, vou criar
‫uma cópia impressa desse objeto de erro, ok?
‫Então let, e estou usando let, e não const, porque
‫é claro que iremos
‫reatribuir um novo erro mais tarde aqui.
‫Portanto, vamos chamar esse erro em vez de apenas
‫errar, que é o nome normal dos erros no Express.
‫E então, novamente, vamos usar
‫nosso truque onde usamos a desestruturação do erro original, certo?
‫E assim, a partir de agora, usaremos este erro ao invés de errar.
‫Então, aqui, aqui e aqui.
‫Tudo bem?
‫E então, vamos prosseguir
‫e criar essa função aqui.
‫Então, vamos colocar isso aqui no começo.
‫Tudo bem.
‫Tente se lembrar que isso recebe
‫um erro, e agora vou voltar a chamá-lo de err
‫assim, porque, novamente, esse é o padrão no Express.
‫E para começar, vamos
‫dar uma olhada novamente no objeto de erro aqui, ok?
‫Então aqui temos o caminho e também o valor, ok?
‫Portanto, o caminho aqui é basicamente o nome do
‫campo para o qual os dados de entrada estão no formato errado, certo?
‫E esse valor aqui é esse, que é,
‫claro, o que a gente fez no passado, certo?
‫Então, isso pode acontecer não só para o ID,
‫mas realmente, para qualquer campo que
‫consultarmos com um valor no formato errado, certo?
‫E então, vamos agora
‫basicamente criar uma string que
‫diz que temos um ID inválido com o valor deste neste caso, certo?
‫Então, é caminho e valor, certo?
‫Então, vamos criar uma mensagem aqui e dizer
‫Erro inválido. caminho é
‫errar. valor.
‫OK?
‫E agora, simplesmente retornamos nosso próprio AppError.
‫OK?
‫Assim como mencionei algumas vezes até agora, ok?
‫Então AppError, e eu realmente tenho que incluí-lo aqui,
‫ou exigir, porque eu não fiz isso ainda.
‫Portanto, const AppError é igual a require e mova
‫um nível para cima, depois para a pasta de
‫utilitários e, em seguida, appError.
‫Aqui está.
‫E agora, em ou AppError, passamos nossa mensagem e o
‫código de status 400, que significa Bad Request.
‫Ok, e assim, transformamos o
‫erro estranho que recebíamos
‫do Mongoose em um
‫erro operacional com
‫uma mensagem amigável que (risos)
‫um
‫humano real pode ler, certo?
‫Ok, uma última coisa que
‫precisamos mudar aqui é definir este aqui também como erro, ok?
‫E então, agora, se nosso erro for
‫CastError, bem, passaremos o erro para
‫esta função que retornará nosso AppError,
‫então este e aquele que será enviado ao
‫cliente usando nosso sendErrorProd, OK?
‫E então, vamos tentar isso agora.
‫Então aqui, em nosso pacote. json,
‫temos este script start: prod, então vamos tentar isso.
‫Então, npm execute start: prod, e eu posso realmente completar automaticamente esses
‫nomes de script npm usando tab aqui no terminal, ok?
‫E então, isso vai
‫iniciar um processo em modo de produção, basicamente, ok?
‫E então, vamos tentar novamente.
‫Portanto, se você está fazendo
‫essa solicitação agora, devemos receber de volta
‫a mensagem de erro que acabamos de criar, porque agora estamos em produção.
‫E, de fato, aqui está.
‫Portanto, temos inválido e, em seguida, o nome do
‫campo, ou na verdade o nome do caminho, e o
‫valor que inserimos.
‫Portanto, se tentarmos algo
‫diferente, é claro que obteremos
‫isso e, claro, também nosso código 400 Bad Request.
‫Certo, ótimo.
‫Então, este agora está resolvido.
‫Na próxima aula, cuidaremos da próxima, que é
‫para nomes de campos duplicados, certo?
‫Então, nos vemos em um segundo.