التحقق من صحة البيانات في Node.js باستخدام Joi: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التحقق من صحة البيانات في Node.js باستخدام Joi

في تطبيقات الويب الحديثة على Node.js، يُعد التحقق من صحة البيانات مرحلة حاسمة في معالجة الطلبات. يمكن أن تؤدي الأخطاء في البيانات إلى ثغرات أمنية، أو أعطال، أو انهيار الخادم. واحدة من أقوى وأشهر المكتبات لهذه المهمة هي Joi (تُنطق "جوي"). تتيح لك وصف مخططات البيانات والتحقق من مطابقتها للقواعد المحددة.



ما هي Joi؟

Joi هي مكتبة لوصف المخططات والتحقق من صحة كائنات JavaScript. وهي مشهورة بشكل خاص في نظام Node.js البيئي، حيث تُستخدم غالبًا مع Express أو Hapi أو Fastify. توفر Joi واجهة برمجة تطبيقات بسيطة ومعبرة لتحديد الأنواع، والحقول الإلزامية، والنطاقات، والتعبيرات العادية، والفحوصات المخصصة.



التثبيت

تثبيت Joi عبر npm:

npm install joi


مثال أساسي

لننشئ مخططًا للتحقق من بيانات المستخدم:

const Joi = require('joi');

const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), email: Joi.string() .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })});

const data = { username: 'user123', password: 'pass123', email: 'user@example.com'};

const { error, value } = schema.validate(data);

if (error) { console.log('خطأ في التحقق:', error.details);} else { console.log('البيانات صحيحة:', value);}


الطرق والقواعد الأساسية

تدعم Joi العديد من الأنواع والمعدلات:

  • أنواع البيانات: Joi.string()، Joi.number()، Joi.boolean()، Joi.date()، Joi.array()، Joi.object().
  • الإلزام: .required() — الحقل إلزامي للتعبئة.
  • القيود: .min()، .max()، .length() — للسلاسل والمصفوفات.
  • التعبيرات العادية: .pattern(regex) — التحقق وفقًا لنمط.
  • البريد الإلكتروني وعناوين URL: .email()، .uri() — أدوات تحقق مدمجة.
  • الرسائل المخصصة: .messages() — استبدال الأخطاء الافتراضية.


التحقق من الكائنات والمصفوفات المتداخلة

تتعامل Joi بشكل ممتاز مع الهياكل المعقدة:

const addressSchema = Joi.object({    street: Joi.string().required(),    city: Joi.string().required(),    zip: Joi.string().pattern(/^\\d{5}$/)});

const userSchema = Joi.object({ name: Joi.string().required(), age: Joi.number().integer().min(18).max(120), addresses: Joi.array().items(addressSchema).min(1)});

const userData = { name: 'آنا', age: 25, addresses: [ { street: 'شارع نيفسكي', city: 'سانت بطرسبرغ', zip: '191011' } ]};

const result = userSchema.validate(userData);console.log(result.error ? result.error.details : 'موافق');


معالجة الأخطاء

عند حدوث خطأ في التحقق، تُرجع Joi كائن error.details — مصفوفة تحتوي على وصف تفصيلي لكل خطأ:

if (result.error) {    result.error.details.forEach(detail => {        console.log(`الحقل: ${detail.path.join('.')}، الرسالة: ${detail.message}`);    });}


الاستخدام مع Express

غالبًا ما تُستخدم Joi في middleware للتحقق من الطلبات:

const express = require('express');const Joi = require('joi');const app = express();

app.use(express.json());

const validateUser = (req, res, next) => { const schema = Joi.object({ name: Joi.string().required(), email: Joi.string().email().required() }); const { e

توصيات