Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

duvida sobre o next usado no controller

Boa tarde. Fiquei com uma duvida.

Ao usar o comando next(new NaoEncontrado("Id do Autor não localizado")); no arquivo controller dos autores, ele deveria passar para o proximo middleware do app.js enviando um objeto istancia da classe NaoEncontrado, correto? Mas no caso, o proximo middleware em app.js seria o app.use(manipulador404);, nao seria?

Nesse caso ele nao iria instanciar um novo objeto NaoEncontrado com o valor ""Página não encontrada." ??

Mas no caso da aula, ao usar o next no controller ele parece estar indo direto para o middleware app.use(manipuladorDeErros); que recebe o objeto instanciado no controlador como erro e responde a requisicao corretamente mostrando a mensagem "Id do Autor não localizado".

Por que ao usar o next no controlador ele vai para o middleware manipuladorDeErros e nao para o middleware manipulador404? O que entendi errado?

Obrigado.

2 respostas
solução!

Oi Thiago, tudo bem?

No Express, quando usamos next() passando um erro, o Express automaticamente entende que deve pular todos os middlewares normais e ir diretamente para os middlewares de tratamento de erros. Um middleware de tratamento de erros no Express é identificado por ter quatro parâmetros: err, req, res, next.

No seu caso, o middleware manipuladorDeErros é um middleware de tratamento de erros, enquanto o manipulador404 não é. O manipulador404 é um middleware normal que lida com requisições que não correspondem a nenhuma rota definida.

Vamos revisar o fluxo:

  1. Requisição chega ao controlador: No controlador, você usa next(new NaoEncontrado("Id do Autor não localizado")); para indicar que houve um erro específico.
  2. Express identifica o erro: Como você passou um erro para next(), o Express pula todos os middlewares normais e vai diretamente para os middlewares de tratamento de erros.
  3. Middleware de tratamento de erros: O middleware manipuladorDeErros é chamado, pois ele está configurado para lidar com qualquer erro que seja passado para next().

O manipulador404 é chamado apenas quando nenhuma rota corresponde à URL solicitada, e não quando há um erro específico sendo tratado. Por isso, ao usar next(new NaoEncontrado("Id do Autor não localizado"));, o fluxo vai diretamente para manipuladorDeErros e não para manipulador404.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Muito obrigado Armano!