လွယ်လွယ်ပြောရရင် Middleware ဆိုတာ user ရဲ့ request တစ်ခုက server ထဲ ဝင်လာတဲ့အခါ၊ အဓိက အလုပ် (route handler) မလုပ်ခင် ကြားလမ်းမှာ ဖြတ်ပြီး စစ်ဆေးတာ၊ ပြင်ဆင်တာ၊ မှတ်တမ်းတင်တာ လုပ်တဲ့ အလွှာတစ်ခုပါ။
ရုပ်ရှင်ရုံ ဝင်ပေါက်နဲ့ ဥပမာ ပြောရအောင်။ ရုပ်ရှင်ကြည့်ဖို့ ရုံထဲ ဝင်မယ်ဆိုရင် ခုံမှာ တန်းထိုင်လို့ မရဘူး — အရင် ဝင်ပေါက်မှာ လက်မှတ်စစ်တယ်၊ ပြီးရင် အိတ်ထဲ ဘာပါလဲ စစ်တယ်၊ ပြီးမှ အထဲ ဝင်ခွင့်ရတယ်။ ရုပ်ရှင်ပြီးလို့ ပြန်ထွက်တဲ့အခါလည်း တစ်ဆင့်ချင်း ဖြတ်ရတယ်။ Middleware ကလည်း ဒီအတိုင်းပဲ။ Request တစ်ခုက server ဆီ ရောက်လာရင် အဖြေပြန်မပေးခင် တစ်ဆင့်ချင်း ဖြတ်သန်းရတဲ့ “စစ်ဆေးရေးဂိတ်” တွေပဲ။
တကယ့် code နဲ့ ကြည့်ရအောင်။ Express.js မှာ ဒီလို ရေးတယ် —
const express = require('express');
const app = express();
// middleware: request တိုင်း ဖြတ်ရမယ့် ဂိတ်
app.use((req, res, next) => {
console.log(req.method, req.url); // ဘယ် request ဝင်လဲ မှတ်တမ်း
next(); // နောက်တစ်ဆင့် ဆက်သွား
});
app.get('/profile', (req, res) => {
res.send('Hello!');
});
/profile ကို ဝင်တဲ့ request တိုင်း အရင် app.use ထဲ ဝင်တယ်။ Log ရေးပြီးမှ next() ခေါ်မှ နောက်တစ်ဆင့် ဆက်သွားတယ်။ ဒီမှာ အရေးကြီးတဲ့ အချက်က — next() ကို ခေါ်ဖို့ မေ့သွားရင် request က အဲဒီမှာ ရပ်နေမယ်၊ user ဘက်မှာ စောင့်နေရင်း timeout ဖြစ်သွားမယ်။ Middleware ရေးဖူးသူတိုင်း တစ်ခါတော့ ဒီအမှား လုပ်ဖူးတယ်၊ ကျွန်တော်လည်း ပါတာပေါ့။
Django သုံးသူတွေလည်း ဒါနဲ့ ရင်းနှီးပြီးသားပါ။ settings.py ထဲက MIDDLEWARE ဆိုတဲ့ list ကို ကြည့်ဖူးမှာပေါ့ —
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
]
Request ဝင်လာတိုင်း ဒီ list ထဲက တစ်ခုချင်း အစဉ်လိုက် ဖြတ်တယ်။ ပြန်ထွက်တဲ့အခါကျတော့ ပြောင်းပြန် အစဉ်နဲ့ ပြန်ဖြတ်တယ်။ သတိထားမိမှာပါ — middleware အစဉ်အလာ မှားရင် ပြဿနာတက်တယ်။ ဥပမာ auth middleware က session middleware ရဲ့ အနောက်မှာ ရှိရမယ်၊ မဟုတ်ရင် login ဝင်ထားလား စစ်လို့ မရဘူး။
ဒါဆို middleware ကို ဘာတွေအတွက် သုံးလဲဆိုတော့ —
Logging — ဘယ် request ဘယ်အချိန်ဝင်လဲ၊ ဘယ်လောက်ကြာလဲ မှတ်တမ်းတင်
Auth check — login ဝင်ပြီးသားလား စစ်၊ မဝင်ရသေးရင် login page ဆီ ပြန်
CORS — တခြား domain က website ကနေ ခေါ်လို့ ရမရ ဆုံးဖြတ်
Error handling — တစ်ခုခု error တက်ရင် လှလှပပ အဖြေပြန်
Rate limiting — တစ်ယောက်တည်း request အများကြီး ဆက်တိုက် ပို့ရင် ခဏ တား
ကိုယ်တိုင် middleware တစ်ခု ရေးကြည့်ချင်ရင် —
Express project အသစ်တစ်ခု ထောင် (npm init, npm install express)
အပေါ်က code ကို app.js ထဲ ကူးထည့်၊ node app.js နဲ့ run
Browser မှာ localhost:3000/profile ဖွင့် — terminal မှာ log တက်လာတာ တွေ့ရမယ်next() ကို comment လုပ်ကြည့်ပါ — page က ဆက်မတက်တော့ဘူး၊ ဒါ middleware ရပ်နေတဲ့ သဘော
နောက် middleware တစ်ခု ထပ်ထည့် — ဥပမာ အချိန်တိုင်းတဲ့ timer middleware
သတိထားရမှာက middleware များများထည့်လေ request တစ်ခုချင်း ဖြတ်ရတဲ့ ဂိတ်များလေပဲ။ မလိုအပ်ဘဲ အများကြီး ထည့်ထားရင် website နှေးသွားတယ်။ လိုတဲ့ဂိတ်ပဲ ထားတဲ့ အကျင့်လုပ်ပါ။
Request ဝင်လာတိုင်း မျက်စိမှိတ် ယုံပြီး အထဲ ထည့်မယ့်အစား ဂိတ်မှာ စစ်ဆေးတာက ကိုယ့် server ကို သန့်ရှင်းပြီး လုံခြုံစေတဲ့ အကျင့်ကောင်းပဲ။ 🙂