Перейти до основного вмісту
Модуль 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;

Корисний шаблон: фабрика правил

Якщо у вас є багато полів для перевірки з однаковою логікою, напишіть 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)];

Кожна фабрика повертає попередньо налаштовану функцію правила. Це точно так само, як використання аналізатора генератор або валідатор, такий як Zod, просто в мініатюрі.

Спробуйте

вправи#js.m8.l3.e1
Спроби: 0Завантаження…

Визначте `validate(obj, rules)`: застосовуйте кожне правило (функція obj -> string|null) і повертайте масив, що містить лише ненульові повідомлення, у тому ж порядку, що й правила.

Завантаження редактора…
Показати підказку

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

Рішення доступне після 3 спроб

Повторна вправа

вправи#js.m8.l3.e2
Спроби: 0Завантаження…

Визначте фабрику `required(field)`: вона повертає правило, яке, заданий об’єктом, повертає null, якщо obj[field] непорожній (не null, не undefined, не порожній рядок), інакше рядок '<field> obbligatorio'.

Завантаження редактора…
Показати підказку

Повертає закриття, яке читає obj[поле].

Рішення доступне після 3 спроб