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

Middleware do erro 404 (not found) antes do middleware do erro 500 (internal server error)

Olá pessoal!

Devido ao middleware para tratamento do erro 404 ter sido definido antes do 500, porque o middleware do 404 não é executado também quando ocorre o erro 500?

// src/config/custom-express.js

// restante das configurações omitidas.

app.use(function (req, resp, next) { // está antes porém não é executado quando ocorre o erro 500, porque?
    return resp.status(404).marko(
        require('../app/views/base/erros/404.marko')
    );
});

app.use(function (erro, req, resp, next) {
    return resp.status(500).marko(
        require('../app/views/base/erros/500.marko')
    );
});

module.exports = app;

Desde já obrigado!

Atenciosamente

3 respostas

Fala ai Elías, tudo bem? Vamos lá:

Devido ao middleware para tratamento do erro 404 ter sido definido antes do 500, porque o middleware do 404 não é executado também quando ocorre o erro 500?

Quando ocorre o erro 500 ele não vai passar pelo 404 porque vai chamar um middleware específico de erro.

Repare que na definição do middleware referente ao erro 500 você definiu uma função com quatro parâmetros, sendo que o primeiro dele é o erro.

Já na função para lidar com 404 sua função possuí apenas três parâmetros e não possuí o erro.

É através desses parâmetros que o Express vai diferenciar e saber quando deve chamar um middleware ou outro.

Espero ter ajudado.

Olá Matheus!

// código anterior

app.use('/estatico', express.static('src/app/public'));

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(methodOverride(function (req, res) {
    if (req.body && typeof req.body === 'object' && '_method' in req.body) {
      // look in urlencoded POST bodies and delete it
      var method = req.body._method;
      delete req.body._method;
      return method; 
    }
}));

const rotas = require('../app/rotas/rotas');
rotas(app);

app.use(function(req, res, next) {
  return res.status(404).marko(require('../app/views/base/erros/404.marko'));
});

app.use(function(erro, req, res, next) {
  return res.status(500).marko(require('../app/views/base/erros/500.marko'));
});

module.exports = app;

Favor me corrija se incorreto: pelo que eu tinha entendido até agora, o código acima é executado na sequência em que foi definido, por isso os middlewares de tratamentos de erros deve ser considerados somente no final do código (para somente serem executados quando nenhuma das rotas/middlewares anteriores corresponder à requisição).

Porém, no caso do middleware específico de erro (função com 4 parâmetros), o Express ignora essa sequência e dá preferência para este middleware (como se fosse um "event listener de erro"), é isso?

Desde já obrigado!

Atenciosamente.

solução!

Porém, no caso do middleware específico de erro (função com 4 parâmetros), o Express ignora essa sequência e dá preferência para este middleware (como se fosse um "event listener de erro"), é isso?

Basicamente sim, por baixo dos panos acontece muito mais coisas e técnica também, mas, de maneira resumida e simplista é exatamente isso, você está certo.

Abraços