Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 59 – API JavaScript, Node.js e Express – Query Optimization – Performance tuning

Imagem destacada da aula de API

Introdução (3 min)

Imagine um restaurante lotado. Se o garçom tiver que procurar cada ingrediente em armários desorganizados, o serviço será lento e ineficiente. Otimizar queries em APIs é como organizar a cozinha do restaurante: permite servir os dados rapidamente e de forma eficiente.

Em APIs modernas, onde a performance é fundamental, a otimização de queries é vital para garantir a escalabilidade e uma boa experiência do usuário. Nesta aula, vamos construir um endpoint em Node.js/Express que demonstra técnicas de otimização para lidar com consultas a um banco de dados, melhorando drasticamente o tempo de resposta.

No contexto Node.js/Express, a otimização de queries é ainda mais relevante devido à natureza assíncrona da plataforma. Através de técnicas específicas, podemos maximizar o uso dos recursos e evitar gargalos.

Conceito Fundamental (7 min)

Otimização de queries refere-se ao conjunto de técnicas utilizadas para tornar as consultas a um banco de dados mais rápidas e eficientes. Isso envolve desde a estrutura das queries SQL até a forma como interagimos com o banco de dados a partir da nossa aplicação.

Alguns termos importantes incluem índices, que aceleram buscas em colunas específicas, e planos de execução, que detalham como o banco de dados processa uma query. Em produção, a otimização de queries é indispensável para lidar com grandes volumes de dados. Plataformas de e-commerce, redes sociais e jogos online se beneficiam diretamente dessas técnicas.

A otimização se integra com tecnologias como ORMs (Object-Relational Mappers) e ferramentas de monitoramento de performance. A principal vantagem é o ganho de performance, resultando em tempos de resposta menores e melhor experiência do usuário. A desvantagem é a complexidade adicional no desenvolvimento, exigindo análise cuidadosa e testes rigorosos.

Implementação Prática (10 min)

const express = require('express');
const app = express();
const port = 3000;
// Simulando um banco de dados (substitua por um banco real)
const database = require('./database'); // Assuma que database.js exporta um array de objetos

// Middleware para logging (essencial em produção) app.use((req, res, next) => { console.log([${new Date().toISOString()}] ${req.method} ${req.url}); next(); });

app.get('/produtos', async (req, res) => { try { const { categoria } = req.query;

// Validação robusta da entrada if (categoria && typeof categoria !== 'string') { return res.status(400).json({ error: 'Categoria inválida' }); }

// Query otimizada com filtro (se necessário) let produtos = database; if (categoria) { // Usando filter para simular uma query com WHERE (substitua por query real no banco) produtos = produtos.filter(p => p.categoria === categoria); }

// Simulando paginação (essencial para grandes datasets) const page = parseInt(req.query.page) || 1; const limit = 10; const startIndex = (page - 1) limit; const endIndex = page limit; const results = produtos.slice(startIndex, endIndex);

res.json({ produtos: results, total: produtos.length });

} catch (error) { console.error("Erro ao buscar produtos:", error); // Logging profissional res.status(500).json({ error: 'Erro interno do servidor' }); // Error handling extraordinário } });

// Inicie o servidor app.listen(port, () => { console.log(Servidor rodando em http://localhost:${port}); });


Instalação das dependências (assumindo que você tem o Node.js e npm instalados)

📚 Informações da Aula

Curso: API Completo - Node.js & Express

Tempo estimado: 25 minutos

Pré-requisitos: JavaScript básico

npm init -y npm install express

Criar database.js (substitua pelos dados reais do seu banco)

// database.js module.exports = [ { id: 1, nome: 'Produto A', categoria: 'Eletrônicos' }, { id: 2, nome: 'Produto B', categoria: 'Roupas' }, // ... mais produtos ];

Executar a aplicação

node index.js

Exercício Hands-On (5 min)

Modifique o código para adicionar um filtro por preço. Adicione um parâmetro precoMaximo na query string e filtre os produtos com preço menor ou igual ao valor fornecido. Teste com diferentes valores e verifique o resultado.

Solução:

Dentro do bloco if (categoria) adicione a seguinte linha:

produtos = produtos.filter(p => p.categoria === categoria && p.preco <= precoMaximo);

Lembre-se de converter precoMaximo para número usando parseFloat() e adicionar validação para garantir que é um número válido.

Teste acessando a rota /produtos?categoria=Eletronicos&precoMaximo=100.

Próximos passos: Explore a documentação do seu banco de dados para aprender sobre índices e outras técnicas de otimização específicas. Utilize ferramentas de profiling para identificar gargalos de performance.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas