Por que paginar
Uma listagem pode ter milhares de itens. Retornar todos é lento e caro. A solução padrão é expor parâmetros na query string que o cliente combina para pedir exatamente o que precisa.
Filtragem
Filtrar reduz a coleção àqueles que cumprem uma condição:
// GET /produtos?categoria=livros
let lista = produtos;
if (req.query.categoria) {
lista = lista.filter((p) => p.categoria === req.query.categoria);
}
Ordenação
sort indica o campo, com um - na frente para descendente (?sort=-preco).
O comparador deve retornar 0 nos empates (caso contrário, a ordem se torna
instável) e funcionar igual com números e com texto:
// GET /produtos?sort=preco ou ?sort=-preco (descendente)
if (req.query.sort) {
const desc = req.query.sort.startsWith("-");
const campo = desc ? req.query.sort.slice(1) : req.query.sort;
lista = [...lista].sort((a, b) => {
if (a[campo] < b[campo]) return desc ? 1 : -1;
if (a[campo] > b[campo]) return desc ? -1 : 1;
return 0; // empate: mantêm sua ordem
});
}
Paginação
Com page (página, começando em 1) e limit (tamanho da página) você calcula o
corte do array com slice:
// GET /produtos?page=2&limit=10
const page = Number(req.query.page) || 1;
const limit = Number(req.query.limit) || 10;
const inicio = (page - 1) * limit;
const pagina = lista.slice(inicio, inicio + limit);
res.json({ page, limit, total: lista.length, dados: pagina });
A ordem habitual é: filtrar → ordenar → paginar. Assim você pagina sobre o resultado já filtrado e ordenado.