Filtrar empleos con query params
En esta clase empezamos a hacer que nuestra API sea un poco más útil y profesional. En lugar de devolver siempre todos los empleos de nuestra lista, vamos a aprender a filtrarlos dinámicamente usando parámetros en la URL.
Esta técnica es fundamental para cualquier API que maneje catálogos de productos, listas de usuarios o, en nuestro caso, ofertas de trabajo.
¿Qué son los query params?
Los query params (o parámetros de consulta) son pares clave-valor que se añaden al final de una URL después del símbolo de interrogación (?).
Por ejemplo, en la URL /jobs?location=Remote, el parámetro es location y su valor es Remote.
Punto de partida
Contamos con un servidor básico y un array de empleos en memoria:
const jobs = [
{ id: 1, title: 'Frontend Developer', location: 'Remote' },
{ id: 2, title: 'Backend Developer', location: 'Barcelona' },
{ id: 3, title: 'Fullstack Developer', location: 'Remote' }
]
app.get('/jobs', (req, res) => {
// Por defecto, devolvemos todo
return res.json(jobs)
})
Accediendo a los query params en Express
Express parsea automáticamente estos parámetros y los pone a nuestra disposición en el objeto req.query.
app.get('/jobs', (req, res) => {
const { location } = req.query
console.log(location) // Imprimirá el valor de ?location=...
return res.json(jobs)
})
Nota: Si el usuario no envía ningún parámetro,
req.queryserá simplemente un objeto vacío ({}).
Implementando la lógica de filtrado
Ahora que podemos leer el valor, vamos a usarlo para filtrar nuestro array de datos:
app.get('/jobs', (req, res) => {
const { location } = req.query
// Si existe el filtro 'location', filtramos la lista original
if (location) {
const filteredJobs = jobs.filter(
job => job.location.toLowerCase() === location.toLowerCase()
)
return res.json(filteredJobs)
}
// Si no hay filtro, devolvemos todos los empleos
return res.json(jobs)
})
Explicación del flujo:
- Extraemos el parámetro: Sacamos
locationdereq.query. - Validamos el filtro: Comprobamos si el usuario ha proporcionado ese parámetro.
- Filtramos: Usamos
.filter()de JavaScript para buscar coincidencias (usamos.toLowerCase()para que la búsqueda no sea sensible a mayúsculas). - Respondemos: Enviamos el resultado filtrado o la lista completa si no hay criterios de búsqueda.
Probando los filtros
- Sin filtros:
http://localhost:1234/jobs→ Devuelve los 3 empleos. - Con filtro:
http://localhost:1234/jobs?location=Remote→ Devuelve solo los 2 empleos remotos. - Sin resultados:
http://localhost:1234/jobs?location=Madrid→ Devuelve un array vacío[].
¿Por qué esto es mejor?
Al usar req.query:
- Evitamos cargar datos innecesarios: El cliente solo recibe lo que le interesa.
- Simplicidad: No tenemos que crear rutas distintas para cada filtro (
/jobs/remote,/jobs/barcelona). - Flexibilidad: Podemos añadir más filtros fácilmente (como por título o empresa) sin cambiar la estructura de la ruta.
Lo que hemos hecho
- ✅ Aprendimos que
req.querycontiene los parámetros después del?. - ✅ Vimos cómo Express extrae y organiza estos parámetros automáticamente.
- ✅ Implementamos un sistema de filtrado dinámico sobre un array de datos.
- ✅ Mejoramos la experiencia de uso de nuestra API.
En la siguiente clase aprenderemos a combinar estos filtros con rutas más específicas y a manejar errores cuando los datos no existen.