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.
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:
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:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);Quyết định xem nó có hợp lệ không
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:
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ó
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.
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
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'.
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ử