Paginación de resultados en Express
En esta clase añadimos paginación al endpoint de empleos que ya teníamos. La idea es no devolver todos los resultados de golpe, sino hacerlo en bloques controlados usando los parámetros limit y offset.
Esto es fundamental cuando una API empieza a manejar listas grandes de datos para mejorar el rendimiento y la experiencia de usuario.
Punto de partida
Partimos del endpoint /jobs que ya devuelve una lista de empleos y permite aplicar filtros básicos:
app.get('/jobs', (req, res) => {
return res.json(jobs)
})
Ahora vamos a mejorarlo añadiendo la lógica necesaria para paginar estos resultados.
Usando query params para la paginación
La paginación la vamos a controlar mediante dos query params estándar:
limit: Indica cuántos elementos queremos devolver en cada “página”.offset: Indica desde qué posición (índice) queremos empezar a contar.
Por ejemplo, si hacemos una petición a /jobs?limit=2&offset=0, estaríamos pidiendo los dos primeros empleos de la lista.
Definición de valores por defecto
Una buena práctica es definir los valores por defecto en un solo sitio centralizado. Esto hace que el código sea más limpio, fácil de mantener y evita los llamados “números mágicos”.
const DEFAULT_LIMIT = 10
const DEFAULT_OFFSET = 0
De esta forma, si en el futuro decides que el límite por defecto debe ser 20, solo tienes que cambiarlo en un único lugar.
Leyendo y transformando los parámetros
Recuerda que todos los valores que llegan a través de req.query son strings. Para poder realizar operaciones matemáticas o usarlos en métodos de arrays, debemos convertirlos a números.
app.get('/jobs', (req, res) => {
// Convertimos a número y usamos el valor por defecto si no se proporciona
const limit = Number(req.query.limit) || DEFAULT_LIMIT
const offset = Number(req.query.offset) || DEFAULT_OFFSET
return res.json(jobs)
})
Aplicando la paginación con slice
Para extraer el trozo (rango) de datos que nos interesa del array, utilizaremos el método nativo de JavaScript .slice():
app.get('/jobs', (req, res) => {
const limit = Number(req.query.limit) || DEFAULT_LIMIT
const offset = Number(req.query.offset) || DEFAULT_OFFSET
// Calculamos el rango: desde el offset hasta (offset + limit)
const paginatedJobs = jobs.slice(offset, offset + limit)
return res.json(paginatedJobs)
})
¿Cómo funciona el rango?
Si offset = 2 y limit = 5, el slice irá desde la posición 2 hasta la 7 (sin incluir la 7), devolviendo exactamente 5 elementos empezando por el tercero.
Probando la paginación
- Un solo empleo:
/jobs?limit=1→ Devuelve solo el primer elemento. - Los dos primeros:
/jobs?limit=2→ Devuelve los empleos con índice 0 y 1. - Saltar el primero:
/jobs?limit=1&offset=1→ Devuelve el segundo empleo de la lista.
Lo que hemos aprendido
- ✅ Los query params siempre llegan como cadenas de texto.
- ✅ Es imprescindible convertir los parámetros de paginación a números.
- ✅ Centralizar los valores por defecto mejora la mantenibilidad del código.
- ✅ El método
.slice()es una forma sencilla y eficaz de paginar arrays en memoria.
En la siguiente lección vamos a crear nuestra primera REST API y qué significa eso. ¡Ya verás!