Перейти к основному содержимому
Модуль 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) и верните массив, содержащий только ненулевые сообщения, в том же порядке, что и правила.

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m8.l3.e2
Попыток: 0Загрузка…

Определите фабрику `required(field)`: она возвращает правило, которое для данного объекта возвращает значение null, если obj[field] не пусто (не null, не undefine, не пустая строка), в противном случае строка '<field> obbligatorio'.

Загрузка редактора…
Показать подсказку

Возвращает замыкание, которое читает obj[field].

Решение доступно после 3 попыток