‫Instrutor: Neste vídeo, vamos falar sobre
‫algo que temos no nó. js chamado rejeições não tratadas
‫e, em seguida, aprender como podemos realmente lidar com elas.
‫Portanto, neste ponto, tratamos com êxito os erros
‫em nosso aplicativo
‫expresso, passando os erros assíncronos operacionais para um
‫middleware de tratamento de erros global.
‫Isso, então, envia mensagens de erro relevantes de
‫volta ao cliente, dependendo do tipo de erro que ocorreu, certo?
‫No entanto, também podem ocorrer erros fora do expresso e um
‫bom exemplo disso em nosso aplicativo atual é a conexão
‫de banco de dados mongodb.
‫Então, imagine que o banco de dados está inativo por algum motivo
‫ou por algum motivo, não podemos fazer login.
‫E, nesse caso, existem erros que
‫também temos que tratar.
‫Mas eles não ocorreram dentro de nosso aplicativo expresso
‫e, portanto, é claro, nosso manipulador de erros
‫que implementamos não detectará esses erros, certo?
‫E então, apenas para testar o
‫que acontece, vamos mudar nossa senha mongodb, ok?
‫Porque assim não conseguiremos
‫nos conectar ao banco de dados, certo?
‫E então devemos obter algum tipo de erro, e
‫então vamos aqui para o nosso arquivo
‫do servidor e salvá-lo a fim de recarregar o nosso
‫servidor, vamos aumentá-lo aqui e, de
‫fato, aqui temos uma rejeição de promessa não tratada.
‫E esse é realmente o tópico deste vídeo.
‫Portanto, uma rejeição de promessa não tratada significa que em algum lugar
‫do nosso código existe uma promessa que foi rejeitada.
‫Mas essa rejeição não foi tratada em lugar nenhum, certo?
‫E aqui embaixo, você também vê um aviso de depreciação que
‫diz que, no futuro, as rejeições não tratadas
‫simplesmente sairão do programa de nó que está em execução, o
‫que pode nem sempre ser o que você deseja, certo?
‫Então, vamos corrigir esse problema e
‫nos livrar dessa rejeição de promessa não tratada.
‫Agora, neste exemplo simples aqui,
‫seria muito
‫fácil lidar com essa rejeição, certo?
‫Tudo o que teríamos que fazer seria vir
‫aqui para este trecho de código onde nossa conexão é realmente feita e,
‫em seguida, adicionar um manipulador de captura lá, certo?
‫Então, um pouco assim, e aqui, poderíamos
‫lidar com essa rejeição
‫e não obteríamos mais esse erro.
‫Deixe-me mostrar isso rapidamente para você.
‫Portanto, tente novamente.
‫E agora, você obtém um erro que é, obviamente, o
‫resultado deste log aqui, mas é
‫claro, não recebemos nenhuma rejeição de promessa não
‫tratada, de novo, porque na verdade lidamos com isso aqui, certo?
‫Então, isso funcionaria, é claro, mas eu realmente quero mostrar a
‫você como lidar globalmente com promessas rejeitadas não tratadas, porque
‫em um aplicativo maior, pode se tornar um pouco
‫mais difícil sempre manter o controle de todas as promessas
‫que podem ser rejeitadas em alguns ponto, ok?
‫E então, em algum ponto, você pode ter
‫alguma rejeição de promessa não tratada em algum lugar, então deixe-me mostrar
‫a você como lidar com isso basicamente de forma global.
‫E agora vamos aprender como lidar com rejeições não tratadas e
‫vamos fazer isso aqui mesmo.
‫E então lembre-se de como em uma das primeiras
‫seções do curso, falamos sobre eventos
‫e ouvintes de eventos, certo?
‫E agora, é hora de realmente usar esse conhecimento.
‫Portanto, cada vez que houver uma rejeição
‫não tratada em algum lugar em nosso aplicativo, o
‫objeto de processo emitirá um objeto chamado rejeição não
‫tratada e, portanto, podemos assinar esse evento exatamente como este.
‫Então processe. on, lembre-se, e o nome
‫do evento, rejeição não tratada, e a função
‫de retorno de
‫chamada aqui recebe um erro e, portanto, vamos
‫prosseguir e registrar o erro no console.
‫Então, vamos usar err. nome e err. mensagem.
‫Esses são alguns padrões que temos em
‫todos os erros no nó. js tudo bem?
‫Ok, e depois de salvar, já pegamos aqui embaixo
‫o nome do erro e também a mensagem do erro.
‫Autenticação tão ruim porque, é claro, temos
‫a senha errada.
‫E agora, a rejeição de promessa não tratada
‫agora está realmente resolvida.
‫E, claro, não apenas o dessa conexão com falha, mas
‫qualquer outra rejeição de promessa que possamos não
‫detectar em algum lugar do aplicativo é tratada aqui neste final,
‫vamos chamá-lo de rede de segurança, certo?
‫Portanto, sempre temos que presumir que nós, como
‫programadores, vamos cometer erros.
‫E então é sempre melhor ter um lugar central como este para
‫lidar com todas as rejeições
‫de promessa, como uma última rede de segurança, certo?
‫Agora, se realmente tivermos algum problema com
‫a conexão do banco de dados, como temos neste exemplo,
‫então nosso aplicativo não vai funcionar de jeito nenhum.
‫E então tudo o que
‫podemos realmente fazer aqui é encerrar nosso aplicativo, certo?
‫Então, para desligar o aplicativo, usamos o processo. saída.
‫E já usamos isso antes
‫naquele script onde importamos todos os
‫dados do arquivo JSON para o banco de dados, lembra?
‫Então processe. sair e
‫aqui, podemos passar um código.
‫E o código zero representa um
‫sucesso e um representa uma exceção não detectada.
‫E esse é o que geralmente é usado aqui, certo?
‫Normalmente, você sempre verá assim.
‫E vamos apenas adicionar como um log aqui, console. log desmanchar a
‫rejeição, algo
‫assim.
‫Então você vê, eu realmente gosto disso, desse aqui.
‫Apenas deixando isso ser um nó ...
‫Não é realmente um usuário,
‫mas nosso log que estamos fechando, certo?
‫E agora, você vê que o aplicativo realmente travou.
‫E isso é por causa desse processo. saia aqui, certo?
‫Agora, há apenas um problema com
‫a maneira como
‫implementamos agora, que é a maneira como
‫implementamos aqui, apenas processamos. exit é uma maneira
‫muito abrupta de encerrar o programa, porque isso
‫irá abortar imediatamente todas as solicitações que ainda estão em
‫execução ou pendentes e, portanto, pode não ser uma boa ideia, ok?
‫E então, normalmente, o que fazemos é desligar
‫normalmente onde primeiro fechamos o servidor
‫e só então, fechamos o aplicativo, ok?
‫Então vamos...
‫Antes de fazermos isso, precisamos salvar
‫o servidor aqui basicamente em uma variável, certo?
‫E assim o resultado de chamar app. listen é um servidor
‫e agora, nesse servidor, podemos dizer servidor. close que irá, como o nome
‫diz, fechar o servidor e depois
‫de fazer isso, irá
‫executar essa função de callback que passamos para ele e
‫então é
‫só aqui, onde então desligamos o servidor, ok?
‫E assim fazendo isso, fazendo servidor. fechar, damos ao
‫servidor, basicamente, tempo para terminar todas as solicitações que
‫ainda estão pendentes ou em tratamento no momento,
‫e só depois disso, o servidor
‫é basicamente encerrado, certo?
‫Então, quando damos a
‫ele um cofre, não vai parecer
‫exatamente o mesmo porque, (risos) sim, somos os
‫únicos que realmente acessam este aplicativo, mas no cenário
‫do mundo real, devemos sempre fazer assim, ok ?
‫E, claro, não é realmente
‫ideal que o aplicativo tenha travado, certo?
‫Porque agora, é claro, o aplicativo não está funcionando,
‫não está funcionando de jeito nenhum, certo?
‫E então, normalmente, em um aplicativo de produção em um servidor web, normalmente
‫teremos alguma ferramenta que reinicia o
‫aplicativo logo após ele travar, ou também algumas das plataformas
‫que hospedam o nó. js fará
‫isso automaticamente por conta própria, ok?
‫Porque, é claro, não queremos deixar o aplicativo
‫suspenso assim para sempre.
‫Então isso também não é útil, certo?
‫E então, basicamente, é assim que
‫você lida com promessas rejeitadas não tratadas.
‫Então, novamente, basicamente, estamos ouvindo esse evento
‫de rejeição não tratado, que nos permite
‫lidar com todos os
‫erros que ocorrem no código
‫assíncrono que não foram tratados anteriormente.
‫Mas agora, você pode perguntar, e o código síncrono?
‫Onde vamos lidar com isso?
‫E a resposta está, como você pode imaginar,
‫no próximo vídeo.