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

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

وقت القراءة: ≈ 5 دقائق

المقدمة

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

بعد التحقق يمكنك وضع middleware أخرى تكون مسؤوليتها التأكد إذا كان الشخص يملك المال الكافي أم لا

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

// 3. Final Middleware!!
server.get(function (req, res, next) {
  const user = getUserByEmail(req.body.email);
  const product = getProductById(req.body.productId);

  // تنفيذ عملية الشراء
  const token = buyProductForUser(user, product);
  saveToken(token);
  // المزيد من الاكواد الخاصة بعمليات الشراء على سبيل المثال ...
  // ...
  // ...

  // بعد الانتهاء نقوم باعلامه بذلك
  return res.send('Done!!, You bought the product successfully');
});

عندما يتم تخطي كل هذه الـ 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 لتستخدمها أنت