توی این مقاله میخوایم با middleware ها توی express.js و کلا دنیای Node.js آشنا بشیم و خب پیشفرض من اینه که حداقل با یکی از فریمورک های بک اندی جاواسکریپتی آشنایی دارید یا کار کردین اما در کل فارغ از هر نوع زبان برنامه نویسی یا فریمورکی مفهوم middleware توی همه شون مشترک هست و صرفا اینجا مثال هامون با فریمورک express.js هست
ببینید وقتی ما یک Request به سمت اپلیکیشن یا وب سایت مورد نظر میفرستیم یکسری پردازش ها روش انجام میشه و بعدش یک Response به ما بر میگرده
حالا این وسط مسطا یه تابعی هست که به اون Request و Response دسترسی داره و میتونه یکسری کارها که ما براش تعیین میکنیم روی اونها انجام بده، به اون تابع میگیم میان افزار یا همون middleware این میشه یک تعریف خیلی ساده (عکس زیر رو ببین)
همون طور که توی عکس زیر میبینید سینتکس middleware تو اکسپرس این شکلی هست:
هر تابع middleware یک request و response و next میگیره، request و response که معلومه چی هستن و خب میمونه next، کار این next اینه درخواست رو به middleware بعدی بفرسته اما دقت کن اگه یادت بره next رو صدا بزنی اپلیکیشنت میره توی عالم هپروت و هنگ میکنه
وقتی هم که از میدلور میخوایم استفاده کنیم اون رو به ()app.use پاس میدیم یا اینکه مثل عکس بالا به اون متد مورد نظر پاسش میدیم
از middleware ها معمولا برای موارد زیر استفاده میکنن:
توی مثال ساده زیر یک میدلور نوشتیم که هر درخواستی میاد سمت سرورمون show request رو لاگ بندازه
const express = require('express'); const app = express(); app.use((req, res, next) => { console.log("show request"); next(); }); app.get('/', (req, res) => { res.send("Hello world"); }); app.listen(3000, () => { console.log(" server is running "); });
به نظرم مفهوم اصلی رسونده شده و بقیه شو خیلی خیلی کامل تر میتونید از مستندات سایت express.js یا فریمورک مد نظرتون پیگیری کنید و از اینجا به بعد مختص جاواسکریپتی ها و express.js هست ولی بازم به درد بقیه فریمورک ها هم میخوره
بریم یه خرده Best Practices راجع به middleware ها یاد بگیریم:
یعنی تا جایی که امکان دار کد هارو توش ساده نگهدارید و فقط و فقط هر میدلور یک کار به خصوص رو انجام بده، یعنی اینطوری نباشه یه میدلور نوشتی هم ارور رو لاگ میندازه هم احرازهویت رو انجام میده، اینطوری دیباگ کردن و تست نویسی برات خیلی سخت میشه پس یادت نره هر کدی که مینویسی بعدن باید ازش پشتیبانی و نگهداری کنیا !!!!
همون طور که قبلنم گفتم اگه یادت بره next رو صدا بزنی باعث میشه اپلیکیشنت دچار اختلال بشه و به درستی درخواست هارو به میدلور های بعدی انتقال نده پس با صدا زدن next میدلور هات انعطاف زیادی پیدا میکنن و زنجیره میلدوریت به دستی کار میکنه و میتونی به راحتی کی میدلور رو حذف یا اضافه کنی بدون اینکه اختلالی توی اپلیکیشن ایجاد بشه
با استفاده از یک try/catch ساده میتونی هر میدلوری که نوشتی اگه خطایی توش رخ بده اون رو به صورت متمرکز توی یک جا مدیریت کنی و اینم یادت باشه همیشه یک میدلور برای مدیریت خطاهات داشته باش که مسئول همین کار باشه و تمام مدیولر هات خطا رو به اون پاس بدن
ترتیب یا همون ordering توی میدلور مهمهف چون این میدلور هات به ترتیب اجرا میشن دیگه. یعنی اینطوری نباشه که تو میدلور error handling رو بیایی اول بزاری بعد احرازهویتت رو اخر بزاری چون اصلا معنی نمیده
نه فقط برای میدلور هات بلکه برای توابع و کلا توی کدنویسی از اسامی با معنی استفاده کن مثلا کد زیر قراره یه چیزی رو لاگ بندازه پس منطقیه اسمش رو بزاریم logger و هدف اون قطعه کد رو میرسونه و هکس بیاد اسمش رو ببینه درجا میفهمه این میدلور قراره چکار کنه
این کار باعث میشه پیچیدگی کدتون زیاد بشه و اصل separation of concerns هم زیر پا بزارید، پس هیچوقت از ()app.use توی هندلر هاتون استفاده نکنید
اینکار از پردازش های غیر ضروری جلوگیری میکنه پس وقتی کار میدلورت تموم میشه مقدار یا عبارت یا هرچیزی که مدنظرت هست رو 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