التحقق من صحة الإدخال في Express باستخدام أداة التحقق السريع

تعرف على كيفية التحقق من صحة أي بيانات واردة كمدخلات في نقاط نهاية Express

لنفترض أن لديك نقطة نهاية POST تقبل الاسم والبريد الإلكتروني ومعلمات العمر:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

كيف يمكنك إجراء التحقق من جانب الخادم على هذه النتائج للتأكد من:

  • الاسم عبارة عن سلسلة من 3 أحرف على الأقل؟
  • البريد الإلكتروني هو بريد إلكتروني حقيقي؟
  • العمر هو رقم بين 0 و 110؟

أفضل طريقة للتعامل مع التحقق من أي نوع من المدخلات القادمة من الخارج في Express هي باستخدامexpress-validatorصفقة:

npm install express-validator

أنت تطلبcheckوvalidationResultكائنات من العبوة:

const { check, validationResult } = require('express-validator');

نجتاز مجموعة منcheck()كالوسيطة الثانية منpost()مكالمة. كلcheck()الاستدعاء يقبل اسم المعلمة كوسيطة. ثم نتصلvalidationResult()للتحقق من عدم وجود أخطاء في التحقق من الصحة. في حالة وجود أي منها ، نقول للعميل

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').isEmail(),
  check('age').isNumeric()
], (req, res) => {
  const errors = validationResult(req)
  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() })
  }

const name = req.body.name const email = req.body.email const age = req.body.age })

إشعار كنت

  • isLength()
  • isEmail()
  • isNumeric()

هناك العديد من هذه الأساليب ، وكلها تأتي منValidator.js، بما فيها:

  • contains()، تحقق مما إذا كانت القيمة تحتوي على القيمة المحددة
  • equals()، تحقق مما إذا كانت القيمة تساوي القيمة المحددة
  • isAlpha()
  • isAlphanumeric()
  • isAscii()
  • isBase64()
  • isBoolean()
  • isCurrency()
  • isDecimal()
  • isEmpty()
  • isFQDN()، هو اسم مجال مؤهل بالكامل؟
  • isFloat()
  • isHash()
  • isHexColor()
  • isIP()
  • isIn()، تحقق مما إذا كانت القيمة موجودة في مصفوفة من القيم المسموح بها
  • isInt()
  • isJSON()
  • isLatLong()
  • isLength()
  • isLowercase()
  • isMobilePhone()
  • isNumeric()
  • isPostalCode()
  • isURL()
  • isUppercase()
  • isWhitelisted()، يتحقق من الإدخال مقابل القائمة البيضاء للأحرف المسموح بها

يمكنك التحقق من صحة الإدخال مقابل تعبير عادي باستخدامmatches().

يمكن التحقق من التواريخ باستخدام

  • isAfter()، تحقق مما إذا كان التاريخ الذي تم إدخاله بعد التاريخ الذي تمر به
  • isBefore()، تحقق مما إذا كان التاريخ الذي تم إدخاله قبل التاريخ الذي تمرره
  • isISO8601()
  • isRFC3339()

للحصول على تفاصيل دقيقة حول كيفية استخدام تلك المدققات ، يرجى الرجوع إلىhttps://github.com/chriso/validator.js#validators.

يمكن دمج كل هذه الشيكات عن طريق الأنابيب:

check('name')
  .isAlpha()
  .isLength({ min: 10 })

إذا كان هناك أي خطأ ، يرسل الخادم تلقائيًا استجابة لإبلاغ الخطأ. على سبيل المثال ، إذا كان البريد الإلكتروني غير صالح ، فسيتم إرجاعه:

{
  "errors": [{
    "location": "body",
    "msg": "Invalid value",
    "param": "email"
  }]
}

يمكن تجاوز هذا الخطأ الافتراضي لكل فحص تقوم به باستخدامwithMessage():

check('name')
  .isAlpha()
  .withMessage('Must be only alphabetical chars')
  .isLength({ min: 10 })
  .withMessage('Must be at least 10 chars long')

ماذا لو كنت تريد كتابة مدقق خاص بك؟ يمكنك استعمال الcustomالمدقق.

في وظيفة رد الاتصال ، يمكنك رفض التحقق إما عن طريق طرح استثناء أو بإعادة وعد مرفوض:

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').custom(email => {
    if (alreadyHaveEmail(email)) {
      throw new Error('Email already registered')
    }
  }),
  check('age').isNumeric()
], (req, res) => {
  const name  = req.body.name
  const email = req.body.email
  const age   = req.body.age
})

المدقق المخصص:

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    throw new Error('Email already registered')
  }
})

يمكن إعادة كتابتها كـ

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    return Promise.reject('Email already registered')
  }
})

تحميل مجانيكتيب Express.js


المزيد من البرامج التعليمية السريعة: