דילוג לתוכן המרכזי
מודול 8 · שיעור 3 מתוך 431/32 בקורס~15 min
שיעורי מודול (3/4)

אתגר: מאמת נתונים

אימות נתוני קלט הוא אחד הדברים שתעשה לרוב: שום טופס, שום API לא יכול בצורה עיוורת לסמוך על מה שהוא מקבל. בואו נבנה תוקף קטן המשלב כללים ניתנים לחיבור ו מחזיר את כל השגיאות שנמצאו, לא רק את הראשונה.

כלל אחד = פונקציה אחת

כלל לוקח את האובייקט ומחזיר את null (הכל טוב) או מחרוזת עם הודעת השגיאה.

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

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

חיבור מספר כללים

האימות מריץ את כל הכללים ואוסף את השגיאות:

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

סגנון פונקציונלי:

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

להחליט אם זה תקף

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

דפוס שימושי: מפעל כללים

כאשר יש לך שדות רבים לאימות עם אותו היגיון, כתוב מפעל:

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

כל מפעל מחזיר פונקציית כלל מוגדרת מראש. זה בדיוק כמו שימוש במנתח מחולל או מאמת כגון Zod, רק במיניאטורה.

נסה את זה

פעילות גופנית#js.m8.l3.e1
ניסיונות: 0טוען...

הגדר `validate(obj, rules)`: החל כל כלל (פונקציה obj -> string|null) והחזר מערך המכיל רק את ההודעות הלא-null, באותו סדר כמו הכללים.

טוען עורך...
הצג רמז

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

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#js.m8.l3.e2
ניסיונות: 0טוען...

הגדר את המפעל `required(field)`: הוא מחזיר כלל שבהינתן אובייקט, מחזיר null אם obj[field] אינו ריק (לא null, לא לא מוגדר, לא מחרוזת ריקה), אחרת המחרוזת '<field> obbligatorio'.

טוען עורך...
הצג רמז

החזר סגירה שקוראת obj[field].

הפתרון זמין לאחר 3 ניסיונות