الـ Middleware وفوائده في تبسيط وتنظيم العمليات
السلام عليكم ورحمة الله وبركاته
الفهرس
المقدمة
تخيل أنك تريد شراء شيء ما من أمازون لنفترض أنه كيلو طماطم على سبيل المثال
فقررت شرائه بالفعل، فأرسلت طلب الشراء للموقع
عندما يصل طلبك إلى الـ 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
يمكننا تلخيصها بأنها مثل وسيط تمر من خلالها العملية التي نريد تنفيذها
ولا تختصر وظيفتها في الحماية
يمكنك أن تجعلها تقوم بعمل اي شيء تريده مثل:
Authentication & Authorization
: يمكننا أن ننشيءmiddleware
تتحقق من صلاحيات الشخص قبل أن نكمل تنفيذ باقي العملياتCaching
: يمكننا أن نستخدمها لتقوم بمهام جانبية كالتحقق من وجود البيانات في الـcache
أم لاValidation
: يمكنك أن تستخدمها لتحقق من صحة البياناتStoring & Retrieving from Database
: التحقق من وجود البيانات داخل قائدة البيانات أو تخزين بيانات جديدةPortable
: بمعنى أنك تستطيع إنشاءmiddleware
وتضعها أو تزيلها منendpoint
تريده
بمعنى أن هناكendpoint
تريد حمايتها وأخرى لا، أو تريد عملcache
هنا و فيendpoint
أخرى لا تريد .. وهكذا...ect
يمكنك فعل ما تشاء هنا، أنت الذي تتحكم بالذي ستضعه او تزيله
يمكنك أن تقوم بعمل middleware
لا تفعل شيئًا اطلاقًا
// Middleware to do nothing
server.use(function (req, res, next) {
console.log('I am a middleware that do nothing :)');
next();
});
الـ
middleware
هو مفهوم ستجده في اغلب لغات البرمجة مع اختلاف شكله قليلًا ستجد نفسك تستخدم العديد من الـmiddleware
الجاهزة التي انشأئها أشخاص أخرون ورفعوها كـpackage
لتستخدمها أنت