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:
- Formato uniforme das respostas de erro em toda a API.
- Um único lugar para registrar (log) as falhas.
- Os handlers ficam limpos: só expressam o caminho feliz e delegam o restante.
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 }, {}, {}, () => {}));