メインコンテンツにスキップ
モジュール 8 · レッスン 3 / 4コース内の 31/32~15 min
モジュールのレッスン (3/4)

課題: データバリデーター

入力データの検証は、最も頻繁に行う作業の 1 つです。フォームや API は盲目的に実行できません。 受け取ったものを信頼してください。 構成可能なルールと 最初のエラーだけでなく、見つかった すべてのエラー を返します。

1 つのルール = 1 つの機能

ルールはオブジェクトを取得し、null (すべて正常) またはエラー メッセージを含む string を返します。

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)` を定義します。これは、オブジェクトが与えられた場合、obj[field] が空でない (null、未定義、空の文字列でない) 場合は null を返し、そうでない場合は文字列 '<field> obbligatorio' を返すというルールを返します。

エディターを読み込み中…
ヒントを表示

obj[field] を読み取るクロージャを返します。

3 回の試行後に解決策が利用可能になります