Уроки модуля (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) и верните массив, содержащий только ненулевые сообщения, в том же порядке, что и правила.
Показать подсказку
Rules.map((r) => r(obj)).filter((m) => m !== null)
Решение доступно после 3 попыток
Обзор упражнения
Определите фабрику `required(field)`: она возвращает правило, которое для данного объекта возвращает значение null, если obj[field] не пусто (не null, не undefine, не пустая строка), в противном случае строка '<field> obbligatorio'.
Показать подсказку
Возвращает замыкание, которое читает obj[field].
Решение доступно после 3 попыток