Chuyển đến nội dung chính
Mô-đun 8 · Bài học 3 trong tổng số 431/32 trong khóa học~15 min
Bài học theo mô-đun (3/4)

Thách thức: trình xác thực dữ liệu

Xác thực dữ liệu đầu vào là một trong những việc bạn sẽ làm thường xuyên nhất: không có biểu mẫu, không có API nào có thể mù quáng tin tưởng những gì nó nhận được. Hãy xây dựng một trình xác thực nhỏ kết hợp quy tắc có thể tổng hợp và trả về tất cả các lỗi được tìm thấy, không chỉ lỗi đầu tiên.

Một quy tắc = một chức năng

Một quy tắc lấy đối tượng và trả về null (tất cả đều tốt) hoặc chuỗi kèm theo thông báo lỗi.

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

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

Soạn nhiều quy tắc

Trình xác thực chạy tất cả các quy tắc và thu thập các lỗi:

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

Phong cách chức năng:

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

Quyết định xem nó có hợp lệ không

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

Mẫu hữu ích: nhà máy quy tắc

Khi bạn có nhiều trường cần xác thực với cùng một logic, hãy viết nhà máy:

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

Mỗi nhà máy trả về một hàm quy tắc được định cấu hình trước. Nó chính xác giống như sử dụng một trình phân tích cú pháp trình tạo hoặc trình xác thực như Zod, chỉ ở dạng thu nhỏ.

Hãy thử nó

tập thể dục#js.m8.l3.e1
Nỗ lực: 0Đang tải…

Xác định `validate(obj, Rules)`: áp dụng từng quy tắc (hàm obj -> chuỗi|null) và trả về một mảng chỉ chứa các thông báo không null, theo cùng thứ tự với các quy tắc.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

quy tắc.map((r) => r(obj)).filter((m) => m !== null)

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#js.m8.l3.e2
Nỗ lực: 0Đang tải…

Xác định nhà máy `required(field)`: nó trả về một quy tắc, cho một đối tượng, trả về null nếu obj[field] không trống (không null, không không xác định, không phải chuỗi trống), nếu không thì chuỗi '<field> obbligatorio'.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Trả về một bao đóng có nội dung obj[field].

Giải pháp khả dụng sau 3 lần thử