Direct naar de hoofdinhoud
Module 8 · Les 3 van 431/32 in de cursus~15 min
Modulelessen (3/4)

Uitdaging: datavalidator

Het valideren van invoergegevens is een van de dingen die je het vaakst zult doen: geen enkel formulier, geen API kan dat blindelings doen vertrouwen op wat het ontvangt. Laten we een kleine validator bouwen die samenstelbare regels combineert en retourneert alle gevonden fouten, niet alleen de eerste.

Eén regel = één functie

Een regel neemt het object en retourneert null (allemaal goed) of een tekenreeks met de foutmelding.

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

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

Meerdere regels opstellen

De validator voert alle regels uit en verzamelt de fouten:

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

Functionele stijl:

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

Beslissen of het geldig is

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

Handig patroon: regelfabriek

Als je veel velden moet valideren met dezelfde logica, schrijf dan een 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)];

Elke fabriek retourneert een vooraf geconfigureerde regelfunctie. Het is precies hetzelfde als het gebruik van een parser generator of een validator zoals Zod, gewoon in miniatuur.

Probeer het

Oefening#js.m8.l3.e1
Pogingen: 0Laden…

Definieer `validate(obj, regels)`: pas elke regel toe (functie obj -> string|null) en retourneer een array die alleen de niet-null berichten bevat, in dezelfde volgorde als de regels.

Editor laden…
Toon hint

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

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#js.m8.l3.e2
Pogingen: 0Laden…

Definieer de fabriek `required(field)`: deze retourneert een regel die, gegeven een object, null retourneert als obj[field] niet leeg is (niet null, niet ongedefinieerd, geen lege string), anders de string '<field> obbligatorio'.

Editor laden…
Toon hint

Retourneert een sluiting die obj[veld] luidt.

Oplossing beschikbaar na 3 pogingen