שיעורי מודול (3/4)
אתגר: מאמת נתונים
אימות נתוני קלט הוא אחד הדברים שתעשה לרוב: שום טופס, שום API לא יכול בצורה עיוורת לסמוך על מה שהוא מקבל. בואו נבנה תוקף קטן המשלב כללים ניתנים לחיבור ו מחזיר את כל השגיאות שנמצאו, לא רק את הראשונה.
כלל אחד = פונקציה אחת
כלל לוקח את האובייקט ומחזיר את null (הכל טוב) או מחרוזת עם הודעת השגיאה.
const nomeRichiesto = (utente) =>
utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';
const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');חיבור מספר כללים
האימות מריץ את כל הכללים ואוסף את השגיאות:
function valida(utente, regole) {
const errori = [];
for (const regola of regole) {
const msg = regola(utente);
if (msg) errori.push(msg);
}
return errori;
}סגנון פונקציונלי:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);להחליט אם זה תקף
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;דפוס שימושי: מפעל כללים
כאשר יש לך שדות רבים לאימות עם אותו היגיון, כתוב מפעל:
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, רק במיניאטורה.
נסה את זה
הגדר `validate(obj, rules)`: החל כל כלל (פונקציה obj -> string|null) והחזר מערך המכיל רק את ההודעות הלא-null, באותו סדר כמו הכללים.
הצג רמז
rules.map((r) => r(obj)).filter((m) => m !== null)
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הגדר את המפעל `required(field)`: הוא מחזיר כלל שבהינתן אובייקט, מחזיר null אם obj[field] אינו ריק (לא null, לא לא מוגדר, לא מחרוזת ריקה), אחרת המחרוזת '<field> obbligatorio'.
הצג רמז
החזר סגירה שקוראת obj[field].
הפתרון זמין לאחר 3 ניסיונות