Federico Lelli / SchoolNode.js & Express
LEZIONE 21 · Express e API

Query string e filtri

Prima di iniziare: le parole della lezione

Query string e filtro
La query string è la parte dell’URL dopo ?, composta da coppie chiave-valore separate da &. Un filtro seleziona elementi secondo una condizione.
Paginazione, limite e offset
La paginazione divide un insieme in parti. Il limite indica quanti elementi restituire; l’offset quanti saltarne dall’inizio.
filter e slice
filter crea un array con gli elementi che soddisfano una condizione. slice restituisce una porzione senza modificare l’array originale.

I parametri query seguono ? nell'URL: /api/persone?cerca=an&limite=5. In Express sono in req.query, che contiene input da considerare non attendibile.

app.get('/api/persone', (req, res) => {
  const cerca = String(req.query.cerca ?? '').toLowerCase();
  const limiteRaw = Number(req.query.limite ?? 10);
  const limite = Number.isInteger(limiteRaw)
    ? Math.min(Math.max(limiteRaw, 1), 100) : 10;
  const risultato = persone
    .filter(p => p.nome.toLowerCase().includes(cerca))
    .slice(0, limite);
  res.json(risultato);
});

Esempio aggiuntivo: la ricerca ?cerca=lu&limite=1 restituisce al massimo una persona il cui nome contiene lu. Per grandi dataset filtri e paginazione andrebbero applicati nel database, non all'array intero.

Chi fa cosa, e perché

Il parametro di percorso identifica tipicamente “quale persona”; la query descrive “quali persone, con quale filtro e limite”. /persone/2 e /persone?limite=2 hanno quindi significati diversi. req.query dipende dal parser configurato: non dare per scontato che ogni valore sia una stringa singola, soprattutto con parametri ripetuti.

La trascrizione usa una ricerca per prefisso: startsWith("an") trova Anna ma non Gianna. Nell’esempio del manuale includes("an") cerca invece in qualsiasi posizione. Documenta quale comportamento scegli. Con una collezione vuota o nessun risultato, una risposta 200 con elenco vuoto è normalmente corretta.

Un altro esempio guidato

// Costruire una query senza concatenare a mano i valori
const query = new URLSearchParams({ cerca: 'Anna Maria', limite: '2' });
console.log(`/api/persone?${query}`);
// /api/persone?cerca=Anna+Maria&limite=2

// Esempio di paginazione su un array già filtrato
const risultati = ['Anna', 'Luca', 'Sara', 'Marta'];
const offset = 2;
const limite = 2;
console.log(risultati.slice(offset, offset + limite));

Come leggerlo e risultato atteso. URLSearchParams codifica lo spazio nella query. L’ultima stampa contiene Sara e Marta: il secondo argomento di slice è l’indice finale escluso. Per una paginazione stabile serve un ordine definito dei risultati.

Prova tu. Prova limite assente, 0, testo e una chiave ripetuta. Decidi se correggere i valori fuori intervallo o rispondere 400, e mantieni la stessa regola nella tua API.

Torna all’indice ↑

Materiali didattici curati e rielaborati da Federico Lelli. Le fonti e i riferimenti specifici sono indicati nei materiali disponibili.