Salt la conținutul principal
Modulul 8 · Lecția 3 din 431/32 în curs~15 min
Lecții din modul (3/4)

Provocare: validator de date

Validarea datelor de intrare este unul dintre lucrurile pe care le veți face cel mai des: nici un formular, nici un API nu poate face orbește ai încredere în ceea ce primește. Să construim un mic validator care combină reguli componabile și returnează toate erorile găsite, nu doar prima.

O regulă = o funcție

O regulă preia obiectul și returnează null (toate bune) sau un șir cu mesajul de eroare.

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

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

Alcătuirea mai multor reguli

Validatorul rulează toate regulile și colectează erorile:

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

Stilul functional:

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

Decizi dacă este valabil

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

Model util: fabrica de reguli

Când aveți multe câmpuri de validat cu aceeași logică, scrieți o fabrică:

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)];

Fiecare fabrică returnează o funcție de regulă preconfigurată. Este exact ca folosirea unui parser generator sau un validator precum Zod, doar în miniatură.

Încearcă

Exercițiu#js.m8.l3.e1
Încercări: 0Se încarcă…

Definiți `validate(obj, rules)`: aplicați fiecare regulă (funcție obj -> șir|null) și returnați o matrice care conține numai mesajele non-null, în aceeași ordine cu regulile.

Se încarcă editorul...
Afișează indiciu

reguli.hartă((r) => r(obj)).filter((m) => m !== null)

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#js.m8.l3.e2
Încercări: 0Se încarcă…

Definiți fabrica `required(field)`: returnează o regulă care, dat un obiect, returnează null dacă obj[câmp] este nevid (nu nul, nedefinit, nu este un șir gol), în caz contrar șirul '<câmp> obligatorio'.

Se încarcă editorul...
Afișează indiciu

Returnează o închidere care citește obj[câmp].

Soluție disponibilă după 3 încercări