Passer au contenu principal
eLearner.app
Module 8 · Leçon 3 sur 431/32 dans le cours~15 min
Leçons du module (3/4)

Sfida: validatore di dati

Validare dati di input è una delle cose che farai più spesso: nessun form, nessuna API può fidarsi ciecamente di ciò che riceve. Costruiamo un piccolo validatore che combina regole componibili e ritorna tutti gli errori trovati, non solo il primo.

Una regola = una funzione

Una regola riceve l'oggetto e ritorna null (tutto ok) oppure una stringa col messaggio d'errore.

JS
const nomeRichiesto = (utente) =>
  utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';

const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');

Comporre più regole

Il validatore esegue tutte le regole e raccoglie gli errori:

JS
function valida(utente, regole) {
  const errori = [];
  for (const regola of regole) {
    const msg = regola(utente);
    if (msg) errori.push(msg);
  }
  return errori;
}

In stile funzionale:

JS
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);

Decidere se è valido

JS
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;

Pattern utile: factory di regole

Quando hai molti campi da validare con la stessa logica, scrivi una factory:

JS
const richiesto = (campo) => (obj) =>
  obj[campo] != null && obj[campo] !== '' ? null : `${campo} obbligatorio`;

const minimo = (campo, n) => (obj) => (obj[campo] >= n ? null : `${campo} deve essere >= ${n}`);

const regole = [richiesto('nome'), richiesto('email'), minimo('eta', 18)];

Ogni factory ritorna una funzione regola già configurata. È esattamente come usare un generatore di parser o un validator come Zod, solo in piccolo.

Prova tu

Exercice#js.m8.l3.e1
Tentatives : 0Chargement…

Definisci `validate(obj, rules)`: applica ogni regola (funzione obj -> stringa|null) e ritorna un array contenente solo i messaggi non-null, nello stesso ordine delle regole.

Chargement de l'éditeur…
Afficher l'indice

rules.map((r) => r(obj)).filter((m) => m !== null)

Solution disponible après 3 tentatives

Esercizio di ripasso

Exercice#js.m8.l3.e2
Tentatives : 0Chargement…

Definisci la factory `required(field)`: ritorna una regola che dato un oggetto ritorna null se obj[field] è non-vuoto (non null, non undefined, non stringa vuota), altrimenti la stringa '<field> obbligatorio'.

Chargement de l'éditeur…
Afficher l'indice

Ritorna una closure che legge obj[field].

Solution disponible après 3 tentatives