Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Middleware manipulador404 roteia para o outro manipulador?

Olá, Durante o curso somos orientados a utilizar a função next passando como parâmetro um objeto da classe "NaoEncontrado" sempre que tivermos um error 404, da seguinte forma:

next(new NaoEncontrado())

Pelo que entendi, essa função irá chamar o manipulador404. Em outros casos de erro nós chamamos a função next passando apenas o erro, como por exemplo:

next(erro)

O arquivo app.js está definidindo os middlewares de manipulação de erros da seguinte forma:

app.use(manipulador404)
app.use(manipuladorDeErros)

Minha dúvida é: como um erro diferente de 404 vai chegar até o manipuladorDeErros, visto que o primeiro middleware encontrado é o manipulador404?

1 resposta
solução!

Oi, tudo bom?

Para responder melhor sua pergunta, é importante esclarecer alguns pontos. O primeiro deles é que o middleware manipulador404 não é tecnicamente um middleware de erros do Express, visto que middlewares de erro sempre são declarados com 4 parâmetros (como o manipuladorDeErros que criamos).

A principal característica dos middlewares de erros é que eles são executados imediatamente quando encaminhamos um erro utilizando a função next, por exemplo, escrevendo next(new NaoEncontrado()). Nesse caso, nós estamos criando um erro 404 manualmente, e ele é encaminhado diretamente para o manipuladorDeErros.

E o outro ponto é que existem outras situações que queremos também gerar um erro 404, como quando alguém digita uma rota inválida (por exemplo /livrosss). É nesses casos em que o Express vai procurar e não vai encontrar nenhuma rota correspondente nos roteadores da aplicação. Com isso, naturalmente, o Express vai executar o middleware que está registrado logo após esses roteadores, que é o manipulador404. No final das contas, esse é um middleware como qualquer outro, e tudo que ele faz é criar manualmente um erro 404 e também encaminhar para o manipuladorDeErros, utilizando o seguinte código:

import NaoEncontrado from "../erros/NaoEncontrado.js";

function manipulador404(req, res, next) {
  const erro404 = new NaoEncontrado();
  next(erro404);
}

export default manipulador404;

Então, resumindo, temos duas situações onde queremos gerar erros 404:

  1. Quando uma rota não é correspondida. Nesse caso, o Express executa o próximo middleware registrado, que é o manipulador404, que por sua vez cria e encaminha um erro 404 para o manipuladorDeErros.
  2. Quando uma rota é correspondida, mas o recurso não é encontrado no banco de dados, como um autor não encontrado. Nesse caso, criamos e encaminhamos um erro 404, e ele não passa pelo manipulador404, e sim vai direto para o manipuladorDeErros.

Mas agora que você trouxe esse ponto, pode ser menos confuso se você alterar o nome do manipulador404 para trataRotaNaoEncontrada (que é o nosso caso 1 acima), por exemplo. O nome "manipulador404" pode acabar fazendo parecer que esse é um middleware de manipulador de erros, ou que ele captura todos os erros 404, o que não é verdade.

Por fim, respondendo diretamente sua pergunta: qualquer erro encaminhado com next() será mandado diretamente para o manipuladorDeErros, independente se é um erro 404 ou não.

Espero ter ajudado! Abraços e bons estudos :)