Como lidar com erros no Express.js?

O Express.js permite lidar com erros utilizando middlewares específicos, garantindo respostas padronizadas e melhor experiência para os usuários.

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.

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

Compartilhe este tutorial: Como lidar com erros no Express.js?

Compartilhe este tutorial

Continue aprendendo:

Como usar o CORS no Node.js e Express.js?

O CORS (Cross-Origin Resource Sharing) no Express.js permite que APIs sejam acessadas por aplicações hospedadas em domínios diferentes.

Tutorial anterior

Como autenticar usuários em uma API Node.js?

A autenticação em uma API Node.js pode ser feita utilizando JSON Web Tokens (JWT), garantindo acesso seguro aos recursos da aplicação.

Próximo tutorial