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:
- 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
. - 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 :)