Dicas e Truques Essenciais do Node.js para Melhorar seu Código

Node.js se consolidou como uma das plataformas mais populares para desenvolvimento backend. Aqui compartilho alguns dicas e truques essenciais que podem melhorar significativamente a qualidade e o desempenho de suas aplicações.

1. Use Variáveis de Ambiente de Forma Segura

Nunca faça commit de credenciais no seu código. Utilize o pacote dotenv para gerenciar variáveis de ambiente:

require('dotenv').config();
const dbPassword = process.env.DB_PASSWORD;

Para produção, considere usar ferramentas como AWS Secrets Manager ou HashiCorp Vault.

2. Implemente Tratamento de Erros Assíncrono Robusto

Use async/await com blocos try-catch para um tratamento de erros mais limpo:

async function fetchData() {
  try {
    const data = await apiCall();
    return data;
  } catch (error) {
    console.error('Erro ao buscar dados:', error);
    throw error;
  }
}

Não se esqueça de tratar promessas rejeitadas não capturadas:

process.on('unhandledRejection', (reason, promise) => {
  console.error('Rejeição Não Tratada:', reason);
  // Registre o erro e considere encerrar o processo
});

3. Otimize o Desempenho com Clustering

Aproveite todos os núcleos da CPU usando o módulo cluster:

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
  const numCPUs = os.cpus().length;
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  // Código do seu servidor
  app.listen(3000);
}

4. Use Streams para Arquivos Grandes

Em vez de carregar arquivos completos na memória, use streams:

const fs = require('fs');
const readStream = fs.createReadStream('arquivo-grande.txt');
const writeStream = fs.createWriteStream('copia.txt');

readStream.pipe(writeStream);

Isso é especialmente importante para operações com arquivos grandes ou processamento de dados em tempo real.

5. Implemente Cache Inteligente

Reduza a carga em seu banco de dados implementando cache com Redis:

const redis = require('redis');
const client = redis.createClient();

async function getUserData(userId) {
  const cached = await client.get(`user:${userId}`);
  if (cached) return JSON.parse(cached);
  
  const user = await db.query('SELECT * FROM users WHERE id = ?', [userId]);
  await client.setex(`user:${userId}`, 3600, JSON.stringify(user));
  return user;
}

6. Valide Entradas com Middleware

Sempre valide e sane as entradas do usuário:

const { body, validationResult } = require('express-validator');

app.post('/user', [
  body('email').isEmail(),
  body('password').isLength({ min: 8 })
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  // Processar solicitação
});

7. Monitore o Event Loop

Evite bloqueios no event loop evitando operações síncronas pesadas:

// Evite isso:
const data = fs.readFileSync('arquivo.txt'); // ❌

// Melhor use isso:
fs.readFile('arquivo.txt', (err, data) => { // ✅
  if (err) throw err;
  console.log(data);
});

Para tarefas intensivas em CPU, considere usar worker threads ou serviços externos.

8. Implemente Rate Limiting

Proteja sua API contra abusos:

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 100 // limite de 100 requisições
});

app.use('/api/', limiter);

9. Use Middleware de Compressão

Reduza o tamanho das respostas HTTP:

const compression = require('compression');
app.use(compression());

Isso pode reduzir significativamente o tempo de carregamento, especialmente para respostas JSON grandes.

10. Mantenha as Dependências Atualizadas

Verifique regularmente vulnerabilidades de segurança:

npm audit
npm audit fix

Considere usar ferramentas como Dependabot ou Snyk para automatizar esse processo.


Quais outras dicas de Node.js foram úteis na sua experiência? Compartilhe suas recomendações nos comentários!

2 curtidas