الـ Middleware وفوائده في تبسيط وتنظيم العمليات

السلام عليكم ورحمة الله وبركاته

وقت القراءة: 3 دقائق

المقدمة

تخيل أنك تريد شراء شيء ما من أمازون لنفترض أنه كيلو طماطم على سبيل المثال
فقررت شرائه بالفعل، فأرسلت طلب الشراء للموقع
عندما يصل طلبك إلى الـ server الخاص بالشركة، هل سيتم تنفيذ طلبك فورًا دون أي قيود ؟
أو شروط أو أي تحقق لهويتك أو إجراءات أمنية؟ بالطبع لا

إذا ما الذي سيحدث ؟

هناك إجراءات سيتم اتخاذها منها:

كل عملية هنا تسمى middleware لأنها تنفذ في منتصف الطريق
قبل أن يصل طلبك لوجهته الأساسية ويتم تنفيذه
عندما يتم تخطي كل هذه الإجراءات بنجاح سيتم تنفيذ طلبك


شراء كيلو طماطم ---> middleware <--- middleware <--- middleware ---> تنفيذ الطلب

كل middleware يقوم بعمل وظيفة معينة

محاكاة بسيطة لبعض استخدامات الـ middleware

الآن سنحاكي بعض استخدامات الـ middleware
بكود تخيلي بسيط لكي تصل الفكرة بشكل عملي وأوضح

الآن انت اشتريت كيلو طماطم من أمازون ماذا سيحدث ؟
طلبك سيذهب للـ server ويصطدم بأول middleware

وليكن على سبيل المثال بهذا الشكل

// Middleware to authenticate the user
server.use(function (req, res, next) {
  // إحضار بيانات الشخص
  const user = getUser(req.body.id);
  // التأكد من أنه يملك الصلحيات
  if (isAuthentic(user)) next(); // التالية middleware إن كان، فاذهب للـ
  // login وإن لم يكن، فسنجعله يذهب لصفحة الـ
  else res.redirect('/login');
});

لتكن أول middleware مسؤولة عن التحقق بهل هذا الشخص سجل دخوله في الموقع أم لا
فإن لم يكن سجل دخوله فنجعله يذهب لصفحة الـ login ليسجل
أما إن كان مسجلا بالفعل فسنستعمل next لنذهب للـ middleware التالية

ملحوظة: يجب ان تتذكر أن تستدعى next بعد ما تنتهي الـ middleware من تنفيذ وظيفتها، وإلا سيظل البرنامج متوقفًا وعالقًا في الـ middleware الحالية ولن ينتقل للـ middleware التالية، لذا تذكر استدعاء next بعد انتهائها

// Middleware to check if the user have enough money
server.use(function (req, res, next) {
  // إحضار بيانات الشخص والمنتج
  const user = getUser(req.body.id);
  const product = getProduct(req.body.productId);

  // التأكد من أنه يملك المال الكافي للشراء
  if (user.money >= product.price) next();
  // وإن لم يكن، فأرسل له رسالة تخبره بأن المال لا يكفي
  else res.send('Sorry, you are not have enough money');
});

الـ middleware ستكون مسؤوليتها التأكد إذا كان الشخص يملك المال الكافي أم لا

وهكذا نظل نضع middleware للتحقق من شيء ما، وعندما نتحقق مما نريد نسلم للـ middleware لتفعل شيء أخر
نظل هكذا لغاية ما نكتفي ونصل للنهاية وننفذ الطلب

// Final Middleware!!
server.get(function (req, res, next) {
  const user = getUser(req.body.id);
  const product = getProduct(req.body.productId);

  // تنفيذ عملية الشراء
  const token = buyProduct(user, product);
  saveToken(token);
  // المزيد من الاكواد المعقدة ...
  // ...

  return res.send('Done!!', token);
});

عندما يتم تخطي كل هذه الـ middleware بنجاح سيتم تنفيذ طلبك في النهاية

ملخص فوائد الـ middleware

الـ middleware يمكننا تلخيصها بأنها مثل وسيط تمر من خلالها العملية التي نريد تنفيذها

ولا تختصر وظيفتها في الحماية
يمكنك أن تجعلها تقوم بعمل اي شيء تريده مثل:

يمكنك فعل ما تشاء هنا، أنت الذي تتحكم بالذي ستضعه او تزيله يمكنك أن تقوم بعمل middleware لا تفعل شيئًا اطلاقًا

// Middleware to do nothing
server.use(function (req, res, next) {
  console.log('I am a middleware that do nothing');
  next();
});

الـ middleware هو مفهوم ستجده في اغلب لغات البرمجة مع اختلاف شكله قليلًا ستجد نفسك تستخدم العديد من الـ middleware الجاهززة التي انشأئها أشخاص أخرون ورفعوها كـ package لتستخدمها أنت