فائدة الـ Middleware في عالم الـ Backend
السلام عليكم ورحمة الله وبركاته
المقدمة
تخيل أنك تريد شراء شيء ما من أمازون لنفترض أنه كيلو طماطم على سبيل المثال
فقررت شرائه بالفعل، فأرسلت طلب الشراء للموقع
عندما يصل طلبك إلى الـ 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لتستخدمها أنت