¿Cómo implementar la búsqueda y el filtrado en una API REST con Node.js y Express.js?

La búsqueda y el filtrado son características muy básicas que una API debe poseer para servir datos a la aplicación cliente de manera eficiente. Al manejar estas operaciones en el lado del servidor, podemos reducir la cantidad de procesamiento que debe realizarse en la aplicación del cliente, lo que aumenta su rendimiento.

Una forma extremadamente popular de implementar esto es con la ayuda de strings de consulta. Una string de consulta es una parte de la URL que nos permite pasar datos del cliente al servidor y viceversa en forma de parámetros y sus valores.

Sintaxis:

http://test.com?name=John&age=21

Aquí, la parte que sigue al signo de interrogación (?) es la string de consulta. Estos son básicamente pares clave-valor que podemos usar para varios propósitos. En este artículo, veremos cómo podemos crear una API REST de Node.js que pueda aceptar estas strings de consulta, filtrar una lista de usuarios en función de estos parámetros proporcionados y luego devolver los resultados coincidentes.

Configurando el Proyecto:

  • Primero, tenemos que inicializar un nuevo proyecto usando Node Package Manager . Podemos completar la configuración seleccionando todas las opciones predeterminadas. 

    npm init
  • A continuación, tenemos que instalar el paquete express.

    npm install express --save

El punto de entrada de esta aplicación será el archivo app.js. Toda nuestra lógica de negocios irá aquí. La API REST contendrá solo una ruta única que devolverá una lista de usuarios, con soporte para buscar y filtrar usando strings de consulta.

Ejemplo: Inicialmente, el archivo app.js se verá así, con la ruta devolviendo solo un mensaje básico.

app.js

const express = require('express');
const data = require('./data');
  
// Initialize App
const app = express();
  
// Assign route
app.use('/', (req, res, next) => {
  res.send('Node.js Search and Filter');
});
  
// Start server on PORT 5000
app.listen(5000, () => {
  console.log('Server started!');
});

Adición de datos simulados: para realizar búsquedas y filtrados, necesitamos algunos datos simulados, es decir, una lista de usuarios sobre los que podemos realizar estas operaciones. Para esto, podemos crear un archivo separado data.js

data.js

const data = [
  { id: 1, name: 'Alan Wake', age: 21, city: 'New York' },
  { id: 2, name: 'Steve Rogers', age: 106, city: 'Chicago' },
  { id: 3, name: 'Tom Hanks', age: 47, city: 'Detroit' },
  { id: 4, name: 'Ryan Burns', age: 16, city: 'New York' },
  { id: 5, name: 'Jack Ryan', age: 31, city: 'New York' },
  { id: 6, name: 'Clark Kent', age: 34, city: 'Metropolis' },
  { id: 7, name: 'Bruce Wayne', age: 21, city: 'Gotham' },
  { id: 8, name: 'Tim Drake', age: 21, city: 'Gotham' },
  { id: 9, name: 'Jimmy Olsen', age: 21, city: 'Metropolis' },
  { id: 10, name: 'Ryan Burns', age: 21, city: 'New York' },
];
  
module.exports = data;

Trabajar con la string de consulta:

  • Consideremos esta URL. Aquí, queremos buscar a todos los usuarios que viven en Metropolis y tienen 21 años.

    http://localhost:5000?city=Metropolis&age=21
  • Podemos acceder a la string de consulta utilizando el atributo de consulta del objeto res

    console.log(res.query)
    >> { city: 'Metropolis', age: '21' }

Podemos ver que contiene todos los parámetros pasados ​​a través de la URL en forma de pares clave-valor. Para aplicar estos parámetros en nuestra lista de usuarios, podemos usar el método Array.filter() y verificar para cada usuario, si cumple con todos los parámetros provistos, y si lo hace, luego agregarlo a la lista de usuarios filtrados

La lista de usuarios filtrados es nuestro resultado final y se puede devolver como respuesta. El código final se proporciona a continuación.

app.js

const express = require('express');
const data = require('./data');
  
// Initialize App
const app = express();
  
// Assign route
app.use('/', (req, res, next) => {
  const filters = req.query;
  const filteredUsers = data.filter(user => {
    let isValid = true;
    for (key in filters) {
      console.log(key, user[key], filters[key]);
      isValid = isValid && user[key] == filters[key];
    }
    return isValid;
  });
  res.send(filteredUsers);
});
  
// Start server on PORT 5000
app.listen(5000, () => {
  console.log('Server started!');
});

Ejemplos

  1. URL: Obtener el usuario cuya identificación es 2

    http://localhost:5000?id=2

    Producción:

    [
       {
           "id": 2,
           "name": "Steve Rogers",
           "age": 106,
           "city": "Chicago"
       }
    ]
  2. URL: Obtener todos los usuarios que viven en Metropolis

    http://localhost:5000?city=Metropolis

    Producción:

    [
        {
            "id": 6,
            "name": "Clark Kent",
            "age": 34,
            "city": "Metropolis"
        },
        {
            "id": 9,
            "name": "Jimmy Olsen",
            "age": 21,
            "city": "Metropolis"
        }
    ]
  3. URL: Obtener todos los usuarios que viven en Metropolis y tienen 21 años

    http://localhost:5000?city=Metropolis&age=21

    Producción

    [
       {
           "id": 9,
           "name": "Jimmy Olsen",
           "age": 21,
           "city": "Metropolis"
       }
    ]

Publicación traducida automáticamente

Artículo escrito por amlankumarnandy y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *