campaign-edianeh-98

همه چیز در مورد کار با Middleware در Express



visibility  
mode_comment   ۴

همه چیز در مورد کار با Middleware در Expressدر این مطلب میخوام هر چیزی که در مورد کار با Middleware در Express نیاز دارید رو بهتون آموزش بدم و شما رو با قدرت اونا آشنا کنم.

همونطور که میدونین سرور Express هم همانند بقیه سرورها در پاسخ به هر Request یا درخواست یک Response یا جواب رو به ما برمی‌گردونه که با این روش میتونیم با Express ارتباط برقرار کنیم. Express یک فریم‌ورک بسیار سبک هست و ویژگی‌های زیادی رو در اختیارتون قرار میده که یکی از این ویژگی‌ها Middleware هست.

Middleware ها توابعی هستند که به شئ req یا درخواست و شئ res یا پاسخ و تابع next دسترسی دارند و با استفاده از اونا میتونین چرخه request و response رو مدیریت کنید.

Middleware ها میتونین کارهای زیر رو انجام بدن:

  • هر کدی رو میتونن اجرا کنند.
  • میتونن تغییراتی رو در شئ request یا response به وجود بیارند.
  • میتونن چرخه request-response رو به پایان برسونند.
  • میتونن تابع next رو فراخوانی کنند تا اجرای برنامه ادامه پیدا بکنه.

اگر Middleware فعلی چرخه request-response رو به پایان نرسونه، باید تابع next() رو فراخوانی بکنه تا اجرای برنامه به Middleware بعدی بره. اگر next رو فراخوانی نکنید، سایت همیشه در حالت Loading میمونه و پاسخی رو از سرور دریافت نمیکنید و کار درستی نیست.

آموزش ساخت Middleware در Express

اگر شما تا حالا اپلیکیشنی با استفاده از Express به وجود آورده باشید، پس حتما از Middleware ها نیز استفاده کردید. مثال زیر رو مشاهده کنید:

از این Middleware برای مشخص کردن فایلهای استاتیک استفاده میشه و Express فایلهای درون این مسیر رو در اختیار عموم قرار میده و میتونین از اونا در سمت کلاینت استفاده کنید. یک مثال دیگه هم ببینید:

bodyParser یک ابزار جداگانه هست که باید اون رو دانلود و نصب کنید و با استفاده از اون میتونین درخواست‌های Post رو به راحتی مدیریت کنید و با استفاده از req.body به اونا دسترسی داشته باشید.

همونطور که قبلا نیز گفته شد، در انتهای هر Middleware باید تابع next رو فراخوانی کنید تا اجرای برنامه ادامه پیدا بکنه. فرض کنید که میخوایم با هر درخواستی که به سمت سرور میاد، یک متن در console چاپ بشه. برای اینکار این Middleware ساده رو میسازیم:

حالا اگر بخوایم از این Middleware در Express استفاده کنیم، بصورت زیر عمل خواهیم کرد:

همونطور که میبینید این Middleware رو درون متد app.use قرار دادیم و با اینکار از این Middleware در Express استفاده میشه و با هر درخواست متن Request در console چاپ میشه.

یک npm package به نام Morgan وجود داره که تقریبا چنین کاری رو انجام میده و اطلاعاتی در مورد هر درخواست رو در Console چاپ میکنه.

مثال Authentication یا احراز هویت

فرض کنید که برای مسیرهای خاصی از سایت بخوایم بررسی کنیم که کاربر login هست یا خیر. کدهای زیر رو ببینید:

به Middleware ای که در بالا تعریف کردیم، Route middleware میگن و همونطور که میبینید برای مسیر / یا ریشه از اون استفاده کردیم. هر درخواستی که به این مسیر بیاد، این Middleware اجرا میشه و اگر کاربر login باشه کدهای مربوط به Route مورد نظر نشون داده میشه و pages/index رندر میشه و اگر login نباشه هم وارد مسیر /users/login خواهیم شد.

ساخت Middleware قابل تنظیم

اگر در شرایطی نیاز داشته باشید که Middleware قابل تنظیم و Configurable به وجود بیارید، میتونین با پاس دادن پارامترهای خاصی به اون، این کار رو انجام بدین. فرض کنید که در فایل sample.js یک Middleware بصورت زیر تعریف کنم:

میبینید که با استفاده از module.exports یک تابع از این فایل استخراج کردیم و این تابع یک Middleware رو برگشت میده. حالا شما میتونین با پاس دادن Options های مختلف، کارهای مختلفی رو در Middleware مشخص کنید و با توجه به هر ورودی، کار مشخصی رو در Middleware انجام بدین. حالا مثلا میتونیم بصورت زیر از Middleware قابل تنظیمی که تعریف کردیم، استفاده کنیم:

همونطور که میبینید option های مختلفی به این Middleware پاس دادیم و حالا میتونیم کارهای مورد نظرمون رو در Middleware انجام بدیم.

انواع Middleware در Express

بصورت کلی 5 نوع Middleware وجود داره.

Application-level middleware

این Middleware ها برای هر درخواستی که به اپلیکیشن بیاد اجرا میشن و مختص به Route خاصی نیستند و با استفاده از app.use اونا رو مورد استفاده قرار میدیم. مثال زیر نمونه‌ای از این نوع Middleware هست:

Router-level middleware

این Middleware ها برای همه درخواست‌ها مورد استفاده قرار نمیگیرن و فقط برای درخواستهایی که مختص به مسیر خاصی هستند، استفاده میشن. مثال زیر رو ببینید:

همونطور که میبینید isLoggedIn رو بصورت مستقیم در تعریف Route قرار دادیم و با اینکار این Middleware فقط برای همین Route مورد استفاده قرار میگیره. علاوه بر این روش میتونین با استفاده از متد router.use نیز از این Middleware برای یک Route خاص استفاده کنید. برای اینکار بصورت زیر عمل میکنیم:

2 کد بالا مانند یکدیگر عمل میکنند و فرقی با هم ندارند.

Error-handling middleware

با استفاده از این Middleware میتونین Error های برنامه رو بگیرید و با اونا برخورد مناسبی داشته باشید. این middleware ها بجای 3 ورودی، 4 ورودی میگیرن و ورودی اول اونا error می‌باشد. مثال زیر رو ببینید:

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 یا مسیری خاص استفاده کنیم.

متخصص جاوا اسکریپت
با جاوا اسکریپت جادوگری کنید! آیا می دونید با زبان جاوااسکریپت می تونید، برای فرانت اند و بک اند وبسایت ها برنامه نویسی کنید؟ همینطور اپلیکیشن دسکتاپ و موبایل بسازید؟ اگر دوست داری اینکارها رو انجام بدی و React, ElectronJS, ReactNative, NodeJS,MongoDB و ... رو تو یه دوره یاد بگیری، متخصص جاوااسکریپت سون لرن رو حتما ببین : متخصص جاوا اسکریپت arrow_back
comment دیدگاه کاربران
فلاح نژاد replyپاسخ

مطلب مفیدی بود. تشکر
اگر امکانش هست یه مطلب هم درمورد Node js lifecycle و همچنین event loop در node js منتشر کنید!
من این موضوعات رو سرچ کردم هیچ مطلبی به زبان فارسی در این زمینه وجود نداشت!

محمد اسفندیاری

قبلا توضیح داده شده دوست عزیز
https://www.7learn.com/web-programming-languages/java-script/understanding-event-loop-in-javascript

فلاح نژاد replyپاسخ

این مقاله ای که لینکش رو گذاشتید رو خوندم ولی کامل نبود مثلا فاز های event loop توضیح داده نشده!
یه آموزش هم که دیدم یه بخشی به اسم worker poll رو توضیح داد و میگفت که کارای سنگین به عهده این بخشه که برای انجام شون از چندین thread سیستم استفاده میکنه!
لابد میگید خب اگه آموزش دیدی دیگه چرا سوال می پرسی؟ حقیقتش آموزش به زبان انگلیسی بود و اون قسمتش که Node js lifecycle رو توضیح میداد خیلی سخت بود کامل نفهمیدمش برای همین سوال پرسیدم
البته اگه جواب سوال ما رو میدید لطف تون رو میرسونه!
ممنون از مطالبی که منتشر می کنید.

محمد اسفندیاری

در آینده سعی میکتم مطلبی کامل در این موضوع قرار بدم.
موفق باشید

add_circle ارسال دیدگاه

خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :