در این مطلب میخوام هر چیزی که در مورد کار با Middleware در Express نیاز دارید رو بهتون آموزش بدم و شما رو با قدرت اونا آشنا کنم.
همونطور که میدونین سرور Express هم همانند بقیه سرورها در پاسخ به هر Request یا درخواست یک Response یا جواب رو به ما برمیگردونه که با این روش میتونیم با Express ارتباط برقرار کنیم. Express یک فریمورک بسیار سبک هست و ویژگیهای زیادی رو در اختیارتون قرار میده که یکی از این ویژگیها Middleware هست.
Middlewareها توابعی هستند که به شئ req یا درخواست و شئ res یا پاسخ و تابع next دسترسی دارند و با استفاده از اونا میتونین چرخه request و response رو مدیریت کنید.
Middlewareها میتونین کارهای زیر رو انجام بدن:
- هر کدی رو میتونن اجرا کنند.
- میتونن تغییراتی رو در شئ request یا response به وجود بیارند.
- میتونن چرخه request-response رو به پایان برسونند.
- میتونن تابع next رو فراخوانی کنند تا اجرای برنامه ادامه پیدا بکنه.
اگر Middleware فعلی چرخه request-response رو به پایان نرسونه، باید تابع
رو فراخوانی بکنه تا اجرای برنامه به Middleware بعدی بره. اگر next رو فراخوانی نکنید، سایت همیشه در حالت Loading میمونه و پاسخی رو از سرور دریافت نمیکنید و کار درستی نیست.آموزش ساخت Middleware در Express
اگر شما تا حالا اپلیکیشنی با استفاده از Express به وجود آورده باشید، پس حتما از Middlewareها نیز استفاده کردید. مثال زیر رو مشاهده کنید:
app.use(express.static('public'));
از این Middleware برای مشخص کردن فایلهای استاتیک استفاده میشه و Express فایلهای درون این مسیر رو در اختیار عموم قرار میده و میتونین از اونا در سمت کلاینت استفاده کنید. یک مثال دیگه هم ببینید:
app.use(bodyParser.urlencoded({extended: true})); app.use(bodyParser.json());
bodyParser یک ابزار جداگانه هست که باید اون رو دانلود و نصب کنید و با استفاده از اون میتونین درخواستهای Post رو به راحتی مدیریت کنید و با استفاده از
به اونا دسترسی داشته باشید.همونطور که قبلا نیز گفته شد، در انتهای هر Middleware باید تابع next رو فراخوانی کنید تا اجرای برنامه ادامه پیدا بکنه. فرض کنید که میخوایم با هر درخواستی که به سمت سرور میاد، یک متن در console چاپ بشه. برای اینکار این Middleware ساده رو میسازیم:
const logger = function (req, res, next) { console.log('Request'); next(); }
حالا اگر بخوایم از این Middleware در Express استفاده کنیم، بصورت زیر عمل خواهیم کرد:
var express = require('express') var app = express() const logger = function (req, res, next) { console.log('Request'); next(); } app.use(logger); app.get('/', function (req, res) { res.send('Express middleware tutorial'); }); app.listen(3000);
همونطور که میبینید این Middleware رو درون متد app.use قرار دادیم و با اینکار از این Middleware در Express استفاده میشه و با هر درخواست متن Request در console چاپ میشه.
یک npm package به نام Morgan وجود داره که تقریبا چنین کاری رو انجام میده و اطلاعاتی در مورد هر درخواست رو در Console چاپ میکنه.
مثال Authentication یا احراز هویت
فرض کنید که برای مسیرهای خاصی از سایت بخوایم بررسی کنیم که کاربر login هست یا خیر. کدهای زیر رو ببینید:
function isLoggedIn(req, res, next){ if(req.isAuthenticated()){ next(); } else { res.redirect("/users/login"); } } router.get('/', isLoggedIn, function(req, res){ res.render('pages/index'); });
به Middleware ای که در بالا تعریف کردیم، Route middleware میگن و همونطور که میبینید برای مسیر / یا ریشه از اون استفاده کردیم. هر درخواستی که به این مسیر بیاد، این Middleware اجرا میشه و اگر کاربر login باشه کدهای مربوط به Route مورد نظر نشون داده میشه و
رندر میشه و اگر login نباشه هم وارد مسیر خواهیم شد.ساخت Middleware قابل تنظیم
اگر در شرایطی نیاز داشته باشید که Middleware قابل تنظیم و Configurable به وجود بیارید، میتونین با پاس دادن پارامترهای خاصی به اون، این کار رو انجام بدین. فرض کنید که در فایل sample.js یک Middleware بصورت زیر تعریف کنم:
module.exports = function(options) { return function(req, res, next) { // Implement the middleware function based on the options object next(); };
میبینید که با استفاده از module.exports یک تابع از این فایل استخراج کردیم و این تابع یک Middleware رو برگشت میده. حالا شما میتونین با پاس دادن Optionsهای مختلف، کارهای مختلفی رو در Middleware مشخص کنید و با توجه به هر ورودی، کار مشخصی رو در Middleware انجام بدین. حالا مثلا میتونیم بصورت زیر از Middleware قابل تنظیمی که تعریف کردیم، استفاده کنیم:
var sample = require('./sample.js'); app.use(sample({ option1: 'App', option2: 'Dividend' }));
همونطور که میبینید optionهای مختلفی به این Middleware پاس دادیم و حالا میتونیم کارهای مورد نظرمون رو در Middleware انجام بدیم.
انواع Middleware در Express
بصورت کلی 5 نوع Middleware وجود داره.
Application-level middleware
این Middlewareها برای هر درخواستی که به اپلیکیشن بیاد اجرا میشن و مختص به Route خاصی نیستند و با استفاده از
اونا رو مورد استفاده قرار میدیم. مثال زیر نمونهای از این نوع Middleware هست:var express = require('express') var app = express() const logger = function (req, res, next) { console.log('Request'); next(); } app.use(logger); app.get('/', function (req, res) { res.send('Express middleware tutorial'); });
Router-level middleware
این Middlewareها برای همه درخواستها مورد استفاده قرار نمیگیرن و فقط برای درخواستهایی که مختص به مسیر خاصی هستند، استفاده میشن. مثال زیر رو ببینید:
const app = express(); const router = express.Router(); function isLoggedIn(req, res, next){ if(req.isAuthenticated()){ next(); } else{ res.redirect("/users/login"); } } router.get('/', isLoggedIn, function(req, res){ res.render('pages/index'); });
همونطور که میبینید isLoggedIn رو بصورت مستقیم در تعریف Route قرار دادیم و با اینکار این Middleware فقط برای همین Route مورد استفاده قرار میگیره. علاوه بر این روش میتونین با استفاده از متد router.use نیز از این Middleware برای یک Route خاص استفاده کنید. برای اینکار بصورت زیر عمل میکنیم:
const app = express(); const router = express.Router(); function isLoggedIn(req, res, next){ if(req.isAuthenticated()){ next(); } else{ res.redirect("/users/login"); } } router.use(isLoggedIn); router.get('/', function(req, res){ res.render('pages/index'); });
2 کد بالا مانند یکدیگر عمل میکنند و فرقی با هم ندارند.
Error-handling middleware
با استفاده از این Middleware میتونین Errorهای برنامه رو بگیرید و با اونا برخورد مناسبی داشته باشید. این middlewareها بجای 3 ورودی، 4 ورودی میگیرن و ورودی اول اونا error میباشد. مثال زیر رو ببینید:
app.use(function (err, req, res, next) { console.error(err.stack); res.status(500).send('Whoops! Something went wrong'); });
Built-in middleware
این Middlewareها توسط خود Express به وجود اومدند و میتونین از اونا استفاده کنید.
- express.static : با استفاده از این Middleware میتونین فایلهای static رو serve کنید.
- express.json
- express.urlencoded
Third-party middleware
این Middlewareها توسط افراد و شرکتهای دیگه ساخته شدند و میتونین اونا رو با استفاده از npm نصب کرده و از اونا در Express استفاده کنید. شما میتونین از این Middlewareها همانند بقیه Middlewareها برای کل برنامه یا فقط یک مسیر خاص استفاده کنید.
در توضیحات بالا در مورد ابزار body-parser توضیحاتی رو دادیم که این ابزار یک Third-party middleware محسوب میشه.
نتیجهگیری
در این مطلب با کاربرد و نحوه تعریف و استفاده از Middlewareها آشنا شدیم و دیدیم که میتونیم از اونا برای کل Application یا مسیری خاص استفاده کنیم.
ممنون ساده و روان
این مقاله ای که لینکش رو گذاشتید رو خوندم ولی کامل نبود مثلا فاز های event loop توضیح داده نشده!
یه آموزش هم که دیدم یه بخشی به اسم worker poll رو توضیح داد و میگفت که کارای سنگین به عهده این بخشه که برای انجام شون از چندین thread سیستم استفاده میکنه!
لابد میگید خب اگه آموزش دیدی دیگه چرا سوال می پرسی؟ حقیقتش آموزش به زبان انگلیسی بود و اون قسمتش که Node js lifecycle رو توضیح میداد خیلی سخت بود کامل نفهمیدمش برای همین سوال پرسیدم
البته اگه جواب سوال ما رو میدید لطف تون رو میرسونه!
ممنون از مطالبی که منتشر می کنید.
در آینده سعی میکتم مطلبی کامل در این موضوع قرار بدم.
موفق باشید
مطلب مفیدی بود. تشکر
اگر امکانش هست یه مطلب هم درمورد Node js lifecycle و همچنین event loop در node js منتشر کنید!
من این موضوعات رو سرچ کردم هیچ مطلبی به زبان فارسی در این زمینه وجود نداشت!
قبلا توضیح داده شده دوست عزیز
https://7learn.com/web-programming-languages/java-script/understanding-event-loop-in-javascript