"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Tratamento de erros e registro em log em aplicativos Node.js

Tratamento de erros e registro em log em aplicativos Node.js

Publicado em 2024-11-09
Navegar:132

Error Handling and Logging in Node.js Applications

Introdução

No mundo do desenvolvimento de back-end, o tratamento confiável de erros e o registro estruturado são essenciais para a construção de aplicativos resilientes e de fácil manutenção. O tratamento eficaz de erros no Node.js não apenas melhora a experiência do usuário, mas também simplifica a depuração e aprimora o monitoramento do aplicativo. Juntamente com o registro adequado, os desenvolvedores podem rastrear problemas com mais rapidez e monitorar a integridade do sistema em tempo real. Neste artigo, vamos nos aprofundar no tratamento de erros e estratégias de registro em Node.js que podem tornar os aplicativos mais robustos e prontos para produção.

1. Compreendendo o tratamento de erros em Node.js

O tratamento de erros no Node.js tem seus desafios únicos, principalmente devido à sua arquitetura assíncrona e orientada a eventos. Vamos explorar algumas distinções e princípios importantes para o tratamento eficaz de erros no Node.js:

  • Erros síncronos versus erros assíncronos: erros síncronos ocorrem imediatamente e podem ser capturados usando blocos try-catch tradicionais, enquanto erros assíncronos acontecem mais tarde e precisam de tratamento diferente, como retornos de chamada, promessas ou padrões assíncronos/aguardados.
  • Estratégia unificada de tratamento de erros: com inúmeras operações assíncronas, manter uma abordagem unificada ajuda a gerenciar erros de maneira mais eficaz em um aplicativo. O tratamento consistente de erros simplifica a depuração e garante que os erros sejam propagados e registrados uniformemente.

2. Técnicas básicas de tratamento de erros

Node.js fornece vários mecanismos para gerenciar erros, especialmente em fluxos de trabalho assíncronos:

  • Blocos Try-Catch: são úteis para lidar com erros em código síncrono, mas não detectam erros em código assíncrono. Por exemplo:
  try {
    const data = JSON.parse(jsonString);
  } catch (error) {
    console.error("JSON parsing error:", error);
  }
  • Objetos de erro: objetos de erro no Node.js carregam informações importantes, como rastreamentos de pilha, que podem ajudar os desenvolvedores a depurar problemas. As mensagens de erro personalizadas devem ser claras e acionáveis.

  • Tratamento de erros em promessas e assíncrono/espera:

    • Promessas: Use .catch() para lidar com rejeições de promessas.
    fetchData()
      .then(data => console.log(data))
      .catch(error => console.error("Error fetching data:", error));
    
    • Async/Await: agrupa chamadas de espera dentro de um bloco try-catch para tratamento de erros assíncrono.
    async function fetchData() {
      try {
        const data = await someAsyncFunction();
        console.log(data);
      } catch (error) {
        console.error("Error:", error);
      }
    }
    
  • Tratamento de erros globais:

    • Exceções não detectadas: Use process.on('uncaughtException', callback) para capturar exceções não detectadas.
    • Rejeições não tratadas: Use process.on('unhandledRejection', callback) para rejeições de promessas não tratadas. Isso fornece uma última linha de defesa na produção, embora geralmente seja recomendado lidar com erros perto de onde eles se originam.

3. Padrões avançados de tratamento de erros

Para um tratamento de erros mais escalável e sustentável, estas técnicas avançadas são essenciais:

  • Tratamento de erros de middleware no Express: Express fornece um mecanismo integrado de tratamento de erros que captura erros e os transmite para um middleware personalizado.
  app.use((err, req, res, next) => {
    console.error("Error:", err);
    res.status(500).send("Something went wrong!");
  });
  • Gerenciamento centralizado de erros: Um módulo centralizado de tratamento de erros pode ser criado para definir respostas e mensagens de erro personalizadas, fornecendo uma maneira padronizada de lidar com erros.
  class AppError extends Error {
    constructor(message, statusCode) {
      super(message);
      this.statusCode = statusCode;
      Error.captureStackTrace(this, this.constructor);
    }
  }
  • Códigos de erro e classificação: Use códigos de status HTTP para classificar erros (4xx para erros de cliente, 5xx para erros de servidor) e adicione códigos personalizados para registro mais detalhado e rastreamento de erros.

4. Implementando log em Node.js

O registro fornece informações sobre o que está acontecendo em um aplicativo e pode ser inestimável para rastrear bugs. Veja como implementar o registro eficaz em Node.js:

  • Registro básico do console:
    O objeto console (console.log, console.error, etc.) é conveniente, mas limitado na produção. Para registros estruturados e baseados em níveis, é melhor usar uma biblioteca de registros dedicada.

  • Usando Winston para registro:
    Winston é uma biblioteca de registro poderosa que fornece registro estruturado com níveis como informação, aviso, erro e depuração.

  const winston = require("winston");

  const logger = winston.createLogger({
    level: "info",
    format: winston.format.json(),
    transports: [
      new winston.transports.File({ filename: "error.log", level: "error" }),
      new winston.transports.Console({ format: winston.format.simple() })
    ]
  });
  • Níveis de registro:

    • info: informações gerais sobre o comportamento do aplicativo.
    • warning: Avisos, normalmente eventos ininterruptos, mas dignos de nota.
    • erro: questões críticas que precisam de atenção imediata.
    • debug: informações detalhadas úteis para depuração.
  • Registros rotativos:

    A rotação de log limita o tamanho do arquivo de log e garante armazenamento eficiente. O transporte de arquivos Winston-daily-rotate-file do Winston pode ajudar a gerenciar logs diariamente.

5. Gerenciamento de erros e logs em produção

O gerenciamento de erros e logs na produção requer considerações adicionais para manter o desempenho e a segurança dos dados.

  • Usando serviços de registro:
    Integre serviços como Loggly, Papertrail ou ELK Stack (Elasticsearch, Logstash, Kibana) para gerenciamento centralizado de logs. Essas ferramentas oferecem opções poderosas de pesquisa e filtragem para solucionar problemas de produção rapidamente.

  • Considerações sobre desempenho:
    O registro em log pode afetar o desempenho, portanto, evite o registro em log excessivo, especialmente em aplicativos de alto tráfego. Considere definir diferentes níveis de log para desenvolvimento (depuração) e produção (informações ou erros).

  • Protegendo registros:
    Para evitar vazamentos de informações confidenciais, evite registrar dados confidenciais ou use técnicas de mascaramento para anonimizar as informações do usuário.

6. Exemplos do mundo real

  • Aplicativo de comércio eletrônico: para um aplicativo de comércio eletrônico, registrar as ações do usuário e monitorar erros no processo de checkout pode fornecer insights sobre o comportamento do usuário e problemas que impedem conversões.
  • API REST com registro estruturado: uma API REST que usa registro estruturado pode rastrear detalhes de solicitações, erros e acesso do usuário, ajudando a manter a confiabilidade do sistema.

Conclusão

Em resumo, uma estratégia bem projetada de tratamento de erros e registro em Node.js é crucial para construir aplicativos resilientes e de fácil manutenção. O tratamento eficaz de erros e o registro estruturado permitem que os desenvolvedores monitorem, solucionem problemas e otimizem aplicativos, garantindo que estejam preparados para lidar com erros normalmente e acompanhar a integridade do aplicativo. Ao combinar essas técnicas com monitoramento contínuo, você terá um sistema mais confiável pronto para produção.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/divine_nnanna2/error-handling-and-logging-in-nodejs-applications-1k2a?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3