DevPath · Aprenda a programar ESPTEN

Erros e validação robusta

O middleware de erro do Express

Tratamento de erros no Express

No Express, um middleware de erro se distingue dos demais por ter quatro parâmetros: (err, req, res, next). O Express inspeciona a aridade (número de argumentos) da função para reconhecê-lo, então os quatro devem ser declarados, mesmo que você não use next.

function tratarErros(err, req, res, next) {
  const status = err.statusCode || 500;
  res.status(status).json({ error: err.message });
}

Passar o erro com next(err)

Um handler não captura nem responde ao erro ele mesmo: ele delega chamando next(err). Quando um argumento é passado a next, o Express pula todos os middlewares e handlers normais e vai direto ao middleware de erro.

function obterUsuario(req, res, next) {
  const usuario = buscar(req.params.id);
  if (!usuario) {
    return next(new Error("Usuário não encontrado")); // delega
  }
  res.json(usuario);
}

Por que centralizar

Centralizar o tratamento de erros em um único middleware (registrado no final, com app.use(tratarErros)) evita repetir try/catch e respostas de erro em cada handler. Vantagens:

Exemplos

O middleware de erro responde com o status adequado

function tratarErros(err, req, res, next) {
  const status = err.statusCode || 500;
  return { status, body: { error: err.message } };
}

console.log(tratarErros({ message: "Quebrado" }, {}, {}, () => {}));
console.log(tratarErros({ message: "Não existe", statusCode: 404 }, {}, {}, () => {}));
Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
Classes de erro personalizadas →