Mohammad Bohluli
Mohammad Bohluli
خواندن ۴ دقیقه·۴ ماه پیش

میدلور چیه؟ و Best Practices هاش کدومه ؟

توی این مقاله میخوایم با middleware ها توی express.js و کلا دنیای Node.js آشنا بشیم و خب پیشفرض من اینه که حداقل با یکی از فریمورک های بک اندی جاواسکریپتی آشنایی دارید یا کار کردین اما در کل فارغ از هر نوع زبان برنامه نویسی یا فریمورکی مفهوم middleware توی همه شون مشترک هست و صرفا اینجا مثال هامون با فریمورک express.js هست

ببینید وقتی ما یک Request به سمت اپلیکیشن یا وب سایت مورد نظر میفرستیم یکسری پردازش ها روش انجام میشه و بعدش یک Response به ما بر میگرده

حالا این وسط مسطا یه تابعی هست که به اون Request و Response دسترسی داره و میتونه یکسری کارها که ما براش تعیین میکنیم روی اونها انجام بده، به اون تابع میگیم میان افزار یا همون middleware این میشه یک تعریف خیلی ساده (عکس زیر رو ببین)

middleware
middleware


همون طور که توی عکس زیر میبینید سینتکس middleware تو اکسپرس این شکلی هست:

هر تابع middleware یک request و response و next میگیره، request و response که معلومه چی هستن و خب میمونه next، کار این next اینه درخواست رو به middleware بعدی بفرسته اما دقت کن اگه یادت بره next رو صدا بزنی اپلیکیشنت میره توی عالم هپروت و هنگ میکنه

وقتی هم که از میدلور میخوایم استفاده کنیم اون رو به ()app.use پاس میدیم یا اینکه مثل عکس بالا به اون متد مورد نظر پاسش میدیم

از middleware ها معمولا برای موارد زیر استفاده میکنن:

  • وقتی که میخوایم logger درست کنیم یا یک چیزی رو log بندازیم
  • وقتی که میخوایم احرازهویت یا authentication و athurization ایی انجام بدیم
  • وقتی که میخوایم مدیریت خطا یا error handling انجام بدیم (که توی این مورد باید error رو به صورت متغییر چهارم به میدلورت پاس بدی)
  • وقتی که میخوایم یک داده ای رو pars کنیم
  • وقتی که ......(خیلی کار های دیگه)

توی مثال ساده زیر یک میدلور نوشتیم که هر درخواستی میاد سمت سرورمون show request رو لاگ بندازه

const express = require('express'); const app = express(); app.use((req, res, next) => { console.log(&quotshow request&quot); next(); }); app.get('/', (req, res) => { res.send(&quotHello world&quot); }); app.listen(3000, () => { console.log(&quot server is running &quot); });

به نظرم مفهوم اصلی رسونده شده و بقیه شو خیلی خیلی کامل تر میتونید از مستندات سایت express.js یا فریمورک مد نظرتون پیگیری کنید و از اینجا به بعد مختص جاواسکریپتی ها و express.js هست ولی بازم به درد بقیه فریمورک ها هم میخوره

بریم یه خرده Best Practices راجع به middleware ها یاد بگیریم:


  • میدلور تونو همیشه کوچیک و متمرکز نگهدارید

یعنی تا جایی که امکان دار کد هارو توش ساده نگهدارید و فقط و فقط هر میدلور یک کار به خصوص رو انجام بده، یعنی اینطوری نباشه یه میدلور نوشتی هم ارور رو لاگ میندازه هم احرازهویت رو انجام میده، اینطوری دیباگ کردن و تست نویسی برات خیلی سخت میشه پس یادت نره هر کدی که مینویسی بعدن باید ازش پشتیبانی و نگهداری کنیا !!!!


  • همیشه خدا یادتون باشه next رو صدا بزنید

همون طور که قبلنم گفتم اگه یادت بره next رو صدا بزنی باعث میشه اپلیکیشنت دچار اختلال بشه و به درستی درخواست هارو به میدلور های بعدی انتقال نده پس با صدا زدن next میدلور هات انعطاف زیادی پیدا میکنن و زنجیره میلدوریت به دستی کار میکنه و میتونی به راحتی کی میدلور رو حذف یا اضافه کنی بدون اینکه اختلالی توی اپلیکیشن ایجاد بشه


  • همیشه خطا هارو توی میدلورت مدیریت کن

با استفاده از یک try/catch ساده میتونی هر میدلوری که نوشتی اگه خطایی توش رخ بده اون رو به صورت متمرکز توی یک جا مدیریت کنی و اینم یادت باشه همیشه یک میدلور برای مدیریت خطاهات داشته باش که مسئول همین کار باشه و تمام مدیولر هات خطا رو به اون پاس بدن


  • مراقب ترتیب میدلور هات باش

ترتیب یا همون ordering توی میدلور مهمهف چون این میدلور هات به ترتیب اجرا میشن دیگه. یعنی اینطوری نباشه که تو میدلور error handling رو بیایی اول بزاری بعد احرازهویتت رو اخر بزاری چون اصلا معنی نمیده


  • اسم با معنی انتخاب کن

نه فقط برای میدلور هات بلکه برای توابع و کلا توی کدنویسی از اسامی با معنی استفاده کن مثلا کد زیر قراره یه چیزی رو لاگ بندازه پس منطقیه اسمش رو بزاریم logger و هدف اون قطعه کد رو میرسونه و هکس بیاد اسمش رو ببینه درجا میفهمه این میدلور قراره چکار کنه


  • از ()app.use توی route handlers استفاده نکنید

این کار باعث میشه پیچیدگی کدتون زیاد بشه و اصل separation of concerns هم زیر پا بزارید، پس هیچوقت از ()app.use توی هندلر هاتون استفاده نکنید


  • از return توی مدیلورت استفاده کن

اینکار از پردازش های غیر ضروری جلوگیری میکنه پس وقتی کار میدلورت تموم میشه مقدار یا عبارت یا هرچیزی که مدنظرت هست رو return کن تا زنجیره میدلوریت ادامه پیدا کنه و از اجرای کد های غیر ضروری جلوگیری بشه



امیدوارم مورد استفاده اتون قرار گرفته باشه

اگه دوست داشتید توی کانال تلگرامیمون هم عضو بشید LearnByLearn@

بدروووود ❤️


منابع:
https://expressjs.com/en/guide/using-middleware.html
https://expressjs.com/en/guide/writing-middleware.html

https://medium.com/deno-the-complete-reference/node-js-8-best-practices-for-express-middlewares-bb5825ec0844

best practicesnodejsjavascriptmiddlewareexpressjs
علاقمند به تکونولوژی و هرچی که بهش مربوطه، کانال تلگرام LearnByLearn@
شاید از این پست‌ها خوشتان بیاید