Middleware در نود جیاس مثل نگهبانی میمونه که بین درخواست کاربر و پاسخ سرور قرار میگیره. وقتی کاربر میخواد به یه صفحه یا اطلاعات دسترسی پیدا کنه، این نگهبان (Middleware) اول درخواست رو بررسی میکنه تا مطمئن شه همه چی اوکیه! مثلاً میتونه ببینه که کاربر وارد شده یا نه، اجازه دسترسی داره یا نه، و یا حتی میتونه اطلاعات رو قبل از اینکه به سرور بره تغییر بده. توی این مقاله، قراره با هم بررسی کنیم Middleware چطوری تو نود جیاس کار میکنه و چطور میتونیم با استفاده از اون، دسترسیهای کاربران رو مدیریت کنیم.
Middleware چیست ؟
Middleware رو اگه بخوایم ساده توضیح بدیم، یه جور واسطه یا میونجی هست که بین درخواست کاربر و پاسخ سرور قرار میگیره. فرض کن داری میری توی یه سایت، درخواستت اول میره پیش این Middleware تا یه چک بکنه ببینه همه چی اوکیه، مثلاً کاربر لاگین کرده یا اجازه دسترسی داره یا نه. Middleware یه جورایی مثل فیلتر عمل میکنه، میتونه درخواست رو پردازش کنه، اگه نیاز باشه چیزی بهش اضافه کنه یا تغییر بده و بعد اجازه بده بره سمت سرور. خلاصه که، Middleware تو نود جیاس کمک میکنه کنترل بیشتری روی درخواستها و امنیت داشته باشیم.
Middleware در نود جیاس
Middleware تو نود جیاس همون تیکه کدی هست که بین درخواست کاربر و پاسخ سرور قرار میگیره و یه سری کارای اضافی انجام میده. مثلاً فرض کن یه فروشگاه آنلاین داری و میخوای مطمئن شی که فقط کاربرایی که لاگین کردن بتونن سبد خریدشون رو ببینن. اینجاست که Middleware وارد عمل میشه! این نگهبان اول درخواست رو چک میکنه ببینه کاربر وارد شده یا نه، اگه نشده، برش میگردونه به صفحه لاگین. بهطور خلاصه، Middleware یه جور فیلتریه که درخواستها رو قبل از رسیدن به مقصد، کنترل و بررسی میکنه تا همه چی مرتب باشه.
نحوه عملکرد Middleware در فرآیند درخواست و پاسخ
حالا اگه بخوایم ببینیم Middleware چطوری کار میکنه، فرض کن هر بار که کاربر یه درخواست به سرور میفرسته (مثلاً میخواد وارد حساب کاربریش بشه یا یه محصول رو بخره)، این درخواست از چند تا مرحله رد میشه. تو هر مرحله، Middlewareها میتونن درخواست رو پردازش کنن، تغییر بدن یا حتی جلوی ادامه کار رو بگیرن.
مثلاً یه کاربر درخواست میده به سرور که “میخوام این محصول رو بخرم.” اول از همه Middleware چک میکنه که کاربر لاگین کرده یا نه. اگه لاگین نکرده باشه، همون جا متوقفش میکنه و میفرستتش به صفحه ورود. اگه همه چی اوکی باشه، درخواست میره مرحله بعد، مثلاً Middleware دیگهای بررسی میکنه که پرداخت موفق بوده یا نه، و بعدش میره سراغ سرور تا جواب نهایی رو بده.
در واقع Middlewareها این وسط نقش نگهبانهایی رو بازی میکنن که حواسشون به همه چی هست تا هیچ درخواستی بدون چک کردن رد نشه!
انواع Middleware ها در نود جیاس
Middleware تو نود جیاس سه مدل اصلی داره که هر کدومشون برای یه کار خاص استفاده میشن:
1. Middleware عمومی (Global Middleware):
این نوع از Middlewareها مثل یه فیلتر بزرگ هستن که روی کل اپلیکیشن اعمال میشن. هر درخواستی که بیاد، اول از اینجا رد میشه. مثلاً میتونی از این استفاده کنی تا همه درخواستها رو لاگ کنی یا بررسی کنی که همه کاربرا لاگین باشن.
2. Middleware مخصوص مسیر (Route-Specific Middleware):
بعضی وقتا نیازی نیست همه درخواستها از یه Middleware خاص رد بشن، فقط برای مسیرهای خاص لازمه. مثلاً فرض کن فقط میخوای چک کنی که کاربرایی که به مسیر “/admin” میرن، مدیر باشن. اینجاست که از Middleware مخصوص مسیر استفاده میکنی.
3. Middleware برای مدیریت خطا (Error-Handling Middleware):
اینا همون نگهبانای آخری هستن که وقتی یه چیزی خراب میشه وارد عمل میشن. وقتی یه خطایی تو مسیر درخواستها پیش بیاد، این Middlewareها خطا رو بررسی و مدیریت میکنن و میتونن پیغام مناسب به کاربر نشون بدن.
هر کدوم از این مدلها بهت این امکان رو میده که درخواستها رو به بهترین شکل مدیریت کنی و کنترل دقیقی روی اپلیکیشنت داشته باشی.
چرا از Middleware استفاده میکنیم
در واقع خواسته اصلی ما از Middleware ها برقراری نظم و امنیت تو سطح برنامست. درست مثل یه پلیس که بهش میگیم چیکار کنه که امنیت بیشتری تو شهر باشه و دست دزد ها از اموال مردم کوتاه باشه !
قطعا تا اینجای کار فهمیدید که وقتی یه برنامه رو پابلیک میکنید قراره کلی درخواست به بخش های مختلف سایت ارسال بشه و اگه برنامه یه پلیس نداشته باشه افراد مختلف حتی به دیتاییس سایت هم ممکنه دسترسی پیدا کنن و این فاجعس ! ما از Middleware ها استغاده میکنیم که اون آقا دزده نتونه بهمون ضرر بزنه یا بره تو مسیر های مختلف سایتمون خراب کاری کنه و بهشون درخواست بفرسته. و یا یوقت شما نیاز دارید که اطلاعاتی که مثلا خالی هستن و به سمت دیتابیس ارسال میشن رو قبل اینکه به مرحله پاسخ برسه فیلتر و خذف بشه. و خب یکی دیگه از مهم ترین و بهترین قابلیت هایی که Middleware ها میتونن بهمون ارائه بدن ثبت لاگ های مختلفه ، که حالا این درخواست رو کی و از چه پلتفرمی و در چه تاریخی ارسال کرده.
- کنترل سطح دسترسی کاربران (Authentication و Authorization):
Middleware کمک میکنه که بررسی کنیم هر کاربری که درخواست میده، اجازه دسترسی داره یا نه. مثلاً اگه یه کاربر بخواد به یه بخش خصوصی از سایت بره، Middleware اول چک میکنه که آیا وارد حسابش شده و اجازه ورود داره یا نه.
- مدیریت و تغییر درخواستها و پاسخها:
یه قابلیت جذاب Middleware اینه که میتونه درخواستها رو قبل از رسیدن به سرور، تغییر بده. مثلاً میتونی درخواست رو فیلتر کنی یا حتی اطلاعات اضافی بهش اضافه کنی.
- ثبت لاگها (Logging) و ردیابی رویدادها:
Middlewareها خیلی خوبن برای اینکه بتونی رویدادهایی که تو اپلیکیشن اتفاق میافته رو لاگ کنی، مثل اینکه کاربرا چه جاهایی رفتن یا چه خطاهایی رخ داده.
- مدیریت خطاها:
وقتی یه چیزی اشتباه میشه (که همیشه هم پیش میاد!)، Middlewareهای مدیریت خطا میتونن وارد عمل بشن و یه پیغام مناسب به کاربر نشون بدن، تا اوضاع بهتر پیش بره و از خطاهای بزرگ جلوگیری بشه.
Middleware های پراستفاده در نودجیاس
شما در ابتدا باید express.js رو روی پروژه خودتون نصب کنید تا بتونید از قابلیت هایی که داره مثل middleware استفاده کنید. اگه نصبش نکردید یا کلا نمیدونید که این فریم ورک چیه و چرا باید نصبش کنیم ؛ یه سر به این مقاله بزنید.
1. express-session:
این Middleware برای مدیریت سشنها (نشست های کاربری) بهکار میره. وقتی کاربری وارد حسابش میشه، اطلاعات سشنش رو توی سرور نگه میداره تا نیازی نباشه تو هر درخواست دوباره لاگین کنه. خیلی راحت با این میتونی سشن بسازی و مدیریت کنی:
const session = require('express-session');
app.use(session({
secret: 'mysecretkey',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
2. passport:
برای احراز هویت (Authentication) استفاده میشه و این امکان رو میده که از راههای مختلفی مثل لاگین با گوگل، فیسبوک، یا حتی ایمیل و پسورد، کاربر رو وارد کنی. این هم خیلی معروفه و تقریباً همه جا به کار میاد. یه مثال ساده از نحوه استفاده:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(
function(username, password, done) {
// بررسی لاگین کاربر
}
));
3. helmet:
این Middleware برای افزایش امنیت اپلیکیشن ساخته شده. با استفاده از Helmet، میتونی یه سری هدرهای امنیتی به درخواستها اضافه کنی تا اپلیکیشنت از حملات ساده محافظت بشه. خیلی راحت به این صورت استفاده میشه:
const helmet = require('helmet');
app.use(helmet());
4. morgan:
این Middleware برای لاگ کردن درخواستها بهکار میره. هر درخواستی که بیاد، Morgan میتونه اطلاعاتش رو توی کنسول لاگ کنه، مثل زمان درخواست، مسیر و وضعیت پاسخ. برای استفاده ازش:
const morgan = require('morgan');
app.use(morgan('dev'));
توسعه Middleware برای بررسی سطح دسترسی کاربر
برای توسعه یه Middleware سفارشی که سطح دسترسی کاربر رو بررسی کنه، باید یه تیکه کد بنویسیم که قبل از رسیدن درخواست به مسیر اصلی، چک کنه آیا کاربر مجوز لازم برای ورود به اون بخش رو داره یا نه. اینجوری میتونیم مشخص کنیم که مثلاً فقط مدیرها (Admin) یا کاربرایی با دسترسی خاص اجازه ورود به یه بخش مشخص رو داشته باشن.
1. ساخت Middleware سفارشی:
فرض کنیم تو اپلیکیشنمون نقشهای مختلفی داریم، مثلاً “کاربر عادی” و “مدیر“. این Middleware بررسی میکنه که آیا کاربر مدیر هست یا نه. اگه نباشه، نمیذاره وارد بشه و یه پیغام خطا میده.
function checkAdminRole(req, res, next) {
// فرض میکنیم نقش کاربر توی req.user ذخیره شده
if (req.user && req.user.role === 'admin') {
// اگر نقش کاربر admin باشه، میره مرحله بعد
return next();
} else {
// اگر کاربر admin نباشه، خطای دسترسی نشون میده
return res.status(403).json({ message: 'دسترسی غیرمجاز!' });
}
}
2. استفاده از Middleware در مسیرهای خاص:
حالا باید این Middleware رو توی مسیرهایی که فقط مدیرها اجازه دسترسی دارن، استفاده کنیم. مثلاً اگه یه بخش از سایت فقط برای مدیرهاست، میتونیم به این شکل از Middleware استفاده کنیم:
app.get('/admin', checkAdminRole, (req, res) => {
res.send('به بخش مدیریت خوش اومدی!');
});
در این مثال، هر کسی که بخواد به مسیر `admin/` دسترسی پیدا کنه، اول Middleware چک میکنه که آیا کاربر مدیر هست یا نه. اگه مدیر باشه، اجازه ورود میده و محتوای صفحه رو نمایش میده؛ در غیر این صورت، یه پیام “دسترسی غیرمجاز” نشون داده میشه.
3. پیشرفتهتر کردن Middleware:
حالا اگه بخوایم این Middleware رو برای چند نقش مختلف (مثلاً مدیر و کاربر ویژه) گسترش بدیم، میتونیم اینجوری عمل کنیم:
function checkUserRole(roles) {
return function (req, res, next) {
if (req.user && roles.includes(req.user.role)) {
return next();
} else {
return res.status(403).json({ message: 'شما دسترسی لازم را ندارید!' });
}
};
}
// استفاده از Middleware برای چند نقش مختلف
app.get('/admin', checkUserRole(['admin']), (req, res) => {
res.send('به بخش مدیریت خوش اومدی!');
});
app.get('/vip', checkUserRole(['admin', 'vip']), (req, res) => {
res.send('به بخش VIP خوش اومدی!');
});
در این مثال، Middleware جدید میتونه چند نقش رو بررسی کنه. مثلاً تو مسیر `/vip` هم مدیرها و هم کاربرهای ویژه میتونن دسترسی داشته باشن.
نتیجه گیری
به طور خلاصه، Middleware یکی از ابزارهای قدرتمند در نود جیاسه که بهت کمک میکنه درخواستهای ورودی رو کنترل و مدیریت کنی. با استفاده از Middlewareها میتونی وظایف مختلفی مثل احراز هویت، کنترل سطح دسترسی، مدیریت خطا و لاگ کردن رو بهسادگی انجام بدی. ساخت Middleware سفارشی، مثل بررسی نقش کاربر، بهت این امکان رو میده که یه لایه امنیتی خوب تو اپلیکیشن ایجاد کنی و مطمئن بشی هر کسی فقط به بخشهایی که اجازه داره، دسترسی پیدا میکنه.
حالا که یاد گرفتی چطوری Middlewareها کار میکنن و چطوری میتونی یه سیستم دسترسی کاربر بسازی، وقتشه که از این تکنیکها تو پروژههات استفاده کنی تا هم امنیت اپلیکیشن رو بالا ببری و هم کاربرها تجربه بهتری داشته باشن!