Ana içeriğe geç
Modül 8 · Ders 3 ders 4Kurstaki 31/32~15 min
Modül dersleri (3/4)

Zorluk: veri doğrulayıcı

Giriş verilerini doğrulamak en sık yapacağınız şeylerden biridir: hiçbir form, hiçbir API körü körüne bunu yapamaz. aldığına güven. birleştirilebilir kuralları birleştiren küçük bir doğrulayıcı oluşturalım ve Yalnızca ilk hatayı değil, bulunan tüm hataları döndürür.

Bir kural = bir işlev

Bir kural nesneyi alır ve hata mesajıyla birlikte null (tümü iyi) veya bir dize döndürür.

JS
const nomeRichiesto = (utente) =>
  utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';

const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');

Birden fazla kural oluşturma

Doğrulayıcı tüm kuralları çalıştırır ve hataları toplar:

JS
function valida(utente, regole) {
  const errori = [];
  for (const regola of regole) {
    const msg = regola(utente);
    if (msg) errori.push(msg);
  }
  return errori;
}

İşlevsel stil:

JS
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);

Geçerli olup olmadığına karar vermek

JS
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;

Yararlı desen: kural fabrikası

Aynı mantıkla doğrulanacak çok sayıda alanınız olduğunda bir fabrika yazın:

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)];

Her fabrika önceden yapılandırılmış bir kural işlevi döndürür. Tam olarak bir ayrıştırıcı kullanmak gibidir jeneratör veya Zod gibi bir doğrulayıcının minyatürü.

Deneyin

Egzersiz#js.m8.l3.e1
Denemeler: 0Yükleniyor…

'validate(obj, rules)'ı tanımlayın: her kuralı uygulayın (function obj -> string|null) ve kurallarla aynı sırayla yalnızca null olmayan mesajları içeren bir dizi döndürün.

Düzenleyici yükleniyor…
İpucu göster

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

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#js.m8.l3.e2
Denemeler: 0Yükleniyor…

`Required(field)` fabrikasını tanımlayın: bir nesne verildiğinde, obj[field] boş değilse (null değil, tanımsız değil, boş bir dize değil) null değerini döndüren bir kural döndürür, aksi halde '<field> obbligatorio' dizesini döndürür.

Düzenleyici yükleniyor…
İpucu göster

obj[field] yazan bir kapanış döndürün.

3 denemeden sonra çözüm mevcut