Como lidar com erros no Express.js?
Erros em uma aplicação Node.js podem acontecer por diversos motivos, como requisições inválidas, falhas no banco de dados ou problemas internos no servidor. No Express.js, podemos capturar e tratar esses erros usando middlewares de erro.
1. Criando um middleware de tratamento de erros
No Express, um middleware de erro deve ter quatro parâmetros: err, req, res, next
.
const express = require('express');
const app = express();
// Middleware de erro
const errorHandler = (err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ erro: 'Erro interno do servidor' });
};
// Rota que gera um erro proposital
app.get('/erro', (req, res, next) => {
const erro = new Error('Algo deu errado!');
next(erro);
});
app.use(errorHandler);
app.listen(3000, () => console.log('Servidor rodando na porta 3000'));
2. Tratando erros específicos
Podemos personalizar respostas para erros comuns, como 404 (Not Found):
app.use((req, res, next) => {
res.status(404).json({ erro: 'Rota não encontrada' });
});
3. Tratando erros de validação
Se uma API requer um campo obrigatório, podemos retornar um erro apropriado:
app.post('/usuarios', (req, res, next) => {
const { nome } = req.body;
if (!nome) {
return res.status(400).json({ erro: 'O campo nome é obrigatório' });
}
res.json({ mensagem: 'Usuário criado' });
});
4. Lidando com erros assíncronos
Se estivermos utilizando async/await, precisamos capturar exceções corretamente:
app.get('/dados', async (req, res, next) => {
try {
throw new Error('Erro ao buscar os dados');
} catch (error) {
next(error);
}
});
Conclusão
Tratar erros corretamente no Express.js melhora a segurança, experiência do usuário e depuração do sistema. O uso de middlewares de erro e respostas padronizadas torna a API mais previsível e fácil de manter.
Por que tratar erros corretamente é essencial no desenvolvimento de APIs?
O tratamento adequado de erros é um diferencial de APIs bem estruturadas. Em sistemas críticos, como bancos e e-commerces, falhas não tratadas podem gerar grandes prejuízos.
Frameworks modernos como NestJS adotam um modelo avançado de captura de exceções, inspirando-se nas boas práticas do Express.js. Padronizar respostas de erro evita confusão entre desenvolvedores e melhora a confiabilidade das aplicações.
Algumas aplicações:
- Retornar mensagens claras para o usuário
- Prevenir falhas inesperadas no servidor
- Facilitar a depuração de problemas
- Garantir respostas padronizadas na API
- Evitar vazamento de informações sensíveis
Dicas para quem está começando
- Crie um middleware de erro global com
app.use()
. - Use
res.status(codigo).json()
para enviar erros HTTP corretos. - Capture exceções em funções assíncronas com
try/catch
. - Evite expor detalhes internos do erro para o usuário.
- Registre logs de erro para facilitar a depuração.
Contribuições de Henrique Almeida