Erros 400 vs 500 em APIs Node.js: Seu teste pode estar mentindo
A diferença entre tratamento de erros explícitos e erros genéricos pode quebrar seus testes na hora e derrubar produção. capturar, tratar e devolver respostas corretas via Express, sem
Por que isso é importante
Resposta direta: em “Erros 400 vs 500 em APIs: Testes, Try/Catch e Tratamento”, meça no seu contexto — hype e ranking não substituem eval e aceite.
Por que isso é importante
Erros 400 vs 500 em APIs Node.js: Seu teste pode estar mentindo. A diferença entre tratamento de erros explícitos e erros genéricos pode quebrar seus testes na hora e derrubar produção. capturar, tratar e devolver respostas corretas via Express, sem perder a sanidade nem tempo.
Seu teste quebrou? Veja o erro: 500 vs 400
Seu código passou a lançar exceções diretamente? De repente, todos os testes que esperavam 400 agora recebem 500. Isso explode os alarmes e cria pânico – resultado comum quando mudamos o fluxo da API e não readequamos o tratamento de exceptions. O segredo é envolver o processamento em um try/catch, e devolver o status que faz sentido para o contexto. Não trate todo erro como erro de servidor.
Atenção
Se você só jogar exceptions para cima, seu Express devolve status 500 como padrão. Diferencie validação do usuário (400) de falha interna (500) – e nunca deixe exception desacompanhada.
Por que 500 não é sempre culpa do servidor?
Ao lançar uma exception inesperada que não é capturada, sua API sempre responderá com status 500. Se o bug foi do usuário (input inválido, requisição malformada), não retorne 500 – use 400 explicitamente no catch.
Detalhe técnico
O padrão Express é 500 para qualquer erro não tratado. Porém, erros previsíveis (ex: validação) devem ser capturados manualmente e retornar 400.
Use try/catch do jeito certo para APIs
Coloque o bloco try/catch ao redor do seu handler. No catch, verifique o tipo do erro (ex: error.message) e responda com status 400 quando detectar falhas "do usuário". Retorne a mensagem que seu front espera – geralmente, um JSON como {"message": error.message} .
Dica Extra
Capture o erro como unknown no catch para garantir type safety, e faça parsing/casting só depois. Node com TypeScript adora esse padrão.
Teste esperando 400 pode falhar? Sim – e rápido!
Cada vez que um teste espera 400 e recebe 500, o problema está na camada de tratamento. O código mudou para exception, mas o teste ainda espera um erro "delicado". Corrija com try/catch, e retorne 400 na validação. E jamais exponha erro bruto para o cliente.
Atenção
Atualize seu teste quando mudar a maneira como erros são tratados. Muitos falsos positivos/não cobrem suas exceções.
Responda no formato certo: JSON sempre
O front-end quase sempre espera um JSON como resposta, até mesmo para erros. Use {"message":...} – isso torna previsível para quem consome a API e permite melhores mensagens ao usuário.
Evite erro "Type unknown" no TypeScript
O try/catch moderno recomenda pegar erros como unknown. Dentro do catch, faça o cast/verificação para garantir o uso de error.message sem causar crash de tipagem. Isso evita bugs chatos.
Dica Avançada
Para maior controle, crie classes customizadas de erro e diferencie pelo instanceof, retornando status e mensagens adequadas.
Resumo Prático do Handler
Envolva a lógica principal com try/catch. No catch, quando a falha for previsível (entrada ruim), retorne res.status(400).json( {"message": error.message} ). Se for inesperado, logue o erro e mantenha o 500.
Exemplo Básico de Implementação
try { } catch (error: unknown) { res.status(400).json({ message: (error as Error).message }); }
Erros comuns ao tratar erros
Lançar exceptions sem try/catch. Retornar 500 para qualquer falha. Expor stack trace em produção. Esquecer de ajustar testes. Não padronizar mensagens de erro.
Como identificar rapidamente o tipo de erro
Analise a origem: veio do usuário (payload, requisição) ou do servidor (banco, infra)? O primeiro leva 400, o segundo é 500.
Padronização: todo erro deve ter mensagem
Crie uma convenção: toda exception tratável deve carregar um message claro. Facilita logging, debug e leitura dos testes.
Teste automatizado para diferentes tipos de erro
Simule no teste unidade: entrada inválida espera 400, erro de infra (banco off) espera 500. Forçar ambos ajuda a blindar seu handler.
Conclusão: nunca ignore o tratamento de exceção
Erros vão aparecer. O que diferencia um dev maduro é escrever handlers claros, testar 400/500, e devolver respostas robustas. Código seguro é código preparado.
Quer mergulhar mais fundo?
Confira vídeos práticos e discussões técnicas intensas do canal Dev Doido no Youtube. É conteúdo direto ao ponto, repleto de exemplos reais e debugging em tempo real. Torne seu Node.js à prova de produção!
Perguntas frequentes
Em Erros 400 vs 500 em APIs: Testes, Try/Catch e Tratamento, o que «Por que 500 não é sempre culpa do servidor?» pede para fazer esta semana?
Ao lançar uma exception inesperada que não é capturada, sua API sempre responderá com status 500. Se o bug foi do usuário (input inválido, requisição malformada), não retorne 500 – use 400 explicitamente no catch. Em «Por que 500 não é sempre culpa do servidor?», trate como experimento com dono e prazo — não como lista de intenções.
Como provar «Use try/catch do jeito certo para APIs» com um experimento mínimo?
Comece pelo mecanismo: Coloque o bloco try/catch ao redor do seu handler. No catch, verifique o tipo do erro (ex: error.message) e responda com status 400 quando detectar falhas "do usuário". Retorne a mensagem que seu front espera – geralmente, um JSON como {"message".
Quando «Teste esperando 400 pode falhar? Sim – e rápido!» deve esperar atrás de oferta/canal?
Critério do material: Cada vez que um teste espera 400 e recebe 500, o problema está na camada de tratamento. O código mudou para exception, mas o teste ainda espera um erro "delicado". Corrija com try/catch, e retorne 400 na validação. E jamais exponha erro bruto para o cliente. Se precisar de segundo sinal: Atualize seu teste quando mudar a maneira como erros são tratados. Muitos falsos positivos/não cobrem suas exceções.
Qual sinal mostra que «Responda no formato certo: JSON sempre» saiu do papel?
O artigo aponta: O front-end quase sempre espera um JSON como resposta, até mesmo para erros. Use {"message":...} – isso torna previsível para quem consome a API e permite melhores mensagens ao usuário. Ajuste ao contexto de `testes-falham-resolvendo-erros` antes de escalar.