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!