NestJS، یک فریم ورک پیشرو Node.js که به دلیل رویکرد خود در ساخت برنامه های کاربردی کارآمد، قابل اعتماد و مقیاس پذیر در سمت سرور محبوبیت پیدا کرده است. NestJS با استفاده از قدرت TypeScript و ترکیب عناصر برنامه نویسی شی گرا (OOP)، برنامه نویسی تابعی (FP) و برنامه نویسی واکنشی عملکردی (FRP)، یک پلتفرم قوی برای ساخت کارهای پیچیده ارائه می کند.
در این مقاله، به پنج مفهوم اصلی که NestJS را تشکیل میدهند، خواهیم پرداخت:
Controllers, Providers, Modules, Middleware, and Exception Filters
Controllers:
در NestJS، کنترلرها نقش محوری رسیدگی به درخواستهای HTTP ورودی و بازگرداندن پاسخها به مشتری را بر عهده میگیرند. آنها دروازه ای هستند که از طریق آن برنامه شما با دنیای خارج ارتباط برقرار می کند.
برای ایجاد یک کنترلر در NestJS، از دکوریتور Controller در سطح کلاس استفاده می کنیم. این دکوراتور نه تنها کلاس را به عنوان یک کنترلر علامت گذاری می کند، بلکه به ما امکان می دهد مسیر اصلی را که این کنترلر انجام می دهد را مشخص کنیم. در اینجا یک مثال ساده آورده شده است:
در این مثال ما CategoriesController را ساختیم تا رسیدگی کنیم به درخواست های مسیر /v1/categories و دکوریتور Get برای اتصال متد getAllCategories با درخواست های Get استفاده کردیم و در نتیجه اگر هنگامی که یک درخواست GET به '/v1/categories ' ارسال می شود، متد getAllCategories فراخوانی می شود و نتیجه مورد نظر را برمی گرداند.
کنترلرها می توانند چندین مسیر را مدیریت کنند و از همه روش های HTTP پشتیبانی کنند.آنها همچنین می توانند ارائه دهندگان را (که بعداً در مورد آنها صحبت خواهیم کرد) برای مدیریت عملیات پیچیده مانند دسترسی به پایگاه داده یا فراخوانی APIهای خارجی تزریق کنند. در اصل، کنترلکنندهها در NestJS سازماندهنده برنامه شما هستند، درخواستهای دریافتی را به سمت کنترلکنندههای مناسب هدایت میکنند و از دریافت پاسخ صحیح مشتری اطمینان میدهند.
Providers:
Providers یکی از مفاهیم اساسی در NestJS هستند. آنها اغلب برای کپسوله کردن منطق پیچیده استفاده می شوند که امکان ماژولار بودن و آزمایش بهتر را فراهم می کند. Providers می توانند خدمات، مخازن، کارخانه ها، کمک کنندگان و غیره باشند.
در NestJS، یک Providers کلاسی است که با دکوریتور Injectable تزئین شده است. این دکوریتور به NestJS اجازه می دهد تا چرخه حیات کلاس را مدیریت کند و آن را به عنوان یک وابستگی در صورت نیاز تزریق کند. در اینجا یک مثال از یک Providers ساده آورده شده است:
در مثال بالا AppService یک Providers هست که دارای یک متد getHello هست و از آنجایی که AppService با Injectable تزئین شده است، می توان آن را به قسمت های دیگر برنامه مانند کنترلرها یا سایر Providers تزریق کرد.
Providers بخش مهمی از سیستم قدرتمند تزریق وابستگی (DI) NestJS هستند. وقتی یک کلاس به یک Providers وابسته است، نیازی به دانستن نحوه ایجاد آن Providers یا مدیریت چرخه حیات آن نیست. در عوض، به سادگی اعلام میکند که به Providers نیاز دارد و NestJS از بقیه مراقبت میکند. این منجر به کدهای ماژولارتر و قابل آزمایش تر می شود.
در اینجا نمونه ای از یک کنترلر است که به AppService بستگی دارد:
در این مثال، AppController اعلام می کند که به AppService در سازنده خود نیاز دارد. NestJS به طور خودکار یک نمونه از AppService ایجاد می کند و زمانی که نمونه ای از AppController را ایجاد می کند آن را به سازنده ارسال می کند. متد AppService میتواند هنگام رسیدگی به درخواست GET به '/' فراخوانی شود.
Providers ابزار قدرتمندی برای سازماندهی منطق برنامه شما و ایجاد کدهای ماژولارتر و قابل آزمایش تر هستند. در بخش بعدی، مفهوم کلیدی دیگری را در NestJS بررسی خواهیم کرد: ماژول ها.
Modules:
ماژول ها یک عنصر سازمان دهی کلیدی در برنامه های NestJS هستند.آنها راهی برای گروه بندی اجزای مرتبط مانند کنترلرها، ارائه دهندگان و سایر ماژول ها در زیر مجموعه های منطقی و عملکردی ارائه می دهند.این گروهبندی مدیریت و مقیاسبندی برنامههای بزرگ را آسانتر میکند.
یک ماژول با استفاده از دکوریتور Module در سطح کلاس تعریف می شود. این دکوراتور یک شی را می گیرد که می تواند دارای ویژگی هایی برای imports ، controllers ، providers ، exports باشد.
. در اینجا مثالی از یک ماژول ساده آورده شده است:
در این مثال، MyModule ماژولی است که شامل MyController و MyService است. این بدان معناست که MyController و MyService بخشی از یک واحد عملکردی هستند و به راحتی می توان آنها را با هم مدیریت کرد.
آرایه imports برای وارد کردن ماژول های دیگر استفاده می شود و به ماژول فعلی اجازه می دهد تا از providers صادر شده خود استفاده کند.آرایه providers برای تعریف providers استفاده میشود که توسط تزریقکننده Nest نمونهسازی میشوند و ممکن است حداقل در این ماژول به اشتراک گذاشته شوند. آرایه controllers برای فهرست کردن controllers ماژول استفاده میشود که باید در زمینه این ماژول نمونهسازی شوند. آرایه exports برای صادرات providers استفاده می شود و آنها را در دسترس سایر ماژول ها قرار می دهد.
ماژول ها ابزار قدرتمندی برای سازماندهی برنامه NestJS شما و مدیریت وابستگی ها بین بخش های مختلف برنامه شما هستند. آنها encapsulation را ترویج می کنند، سازماندهی کد را بهبود می بخشند، و جداسازی و قابلیت استفاده مجدد ماژول را افزایش می دهند.
Middleware:
Middleware در NestJS تابعی است که قبل از کنترلر مسیر فراخوانی می شود. توابع Middleware به شی درخواست (req)، شی پاسخ (res) و تابع () next در چرخه درخواست-پاسخ برنامه دسترسی دارند. تابع ()next تابعی در روتر Express است که با فراخوانی، Middleware جایگزین Middleware فعلی را اجرا میکند.
توابع Middleware می توانند وظایف زیر را انجام دهند:
- هر کدی را اجرا کنید.
- تغییراتی در درخواست و پاسخ ایجاد کنید.
- چرخه درخواست-پاسخ را پایان دهید.
- توابع Middleware بعدی را در پشته فراخوانی کنید.
در اینجا نمونه ای از Middleware ساده در NestJS آمده است:
در این مثال، LoggerMiddleware یک Middleware است که متد درخواست و URL را لاگ میگیرد و سپس next() را فراخوانی می کند تا کنترل را به تابع Middleware بعدی منتقل کند.
برای استفاده از Middleware روش های مختلفی وجود دارد یکی ازآن ها روش زیر می باشد:
در این مثال، LoggerMiddleware برای تمام مسیرهایی که توسط MyController اداره می شود اعمال می شود.
Middleware یک ابزار قدرتمند در NestJS برای انجام کارهای رایج مانند ثبتنام، اعتبارسنجی و مدیریت خطا و .. است.
Exception Filters:
Exception Filters در NestJS ابزار قدرتمندی برای مدیریت Exception در کل برنامه شما یا زیر مجموعه ای از آن هستند. آنها بخشی از لایه استثنای NestJS هستند. Exception Filters توابعی هستند که Exception پرتاب شده از کنترلرهای برنامه شما را می گیرند و سپس آنها را به نوعی پردازش می کنند.
در اینجا یک مثال از یک Exception Filters ساده آورده شده است:
در این مثال، ErrorFilter یک Exception Filters است که تمام موارد خطا را می گیرد. هنگامی که یک Error پرتاب می شود، متد catch() فراخوانی می شود و یک پاسخ JSON با پیام خطا و برخی جزئیات اضافی ارسال می کند.
برای اعمال فیلتر، میتوانید از دکوراتور UseFilters در سطح متد یا کنترلر یا گلوبال استفاده کنید:
در مثال در سطح گلوبال استفاده کردیم.
Exception Filters ابزار قدرتمندی برای مدیریت و متمرکز کردن مدیریت خطا در برنامه NestJS شما هستند. آنها راهی برای رسیدگی به Exception به روشی تمیز و آسان ارائه می دهند.
نتیجه گیری:
در این مقاله، ما پنج مفهوم اصلی را که زیربنای چارچوب NestJS هستند بررسی کردهایم: Controllers، Provider، Modules، Middleware و Exception Filters. هر یک از این مفاهیم نقش مهمی در توسعه برنامه های کاربردی مقیاس پذیر، قابل نگهداری و کارآمد در سمت سرور دارند. Controllers به عنوان دروازهبان برنامه شما عمل میکنند، درخواستهای دریافتی را مدیریت میکنند و پاسخها را برمیگردانند. Provider منطق پیچیده را محصور می کنند و ماژولار بودن و آزمایش پذیری را ارتقا می دهند. ماژول ها اجزای مرتبط را در زیرمجموعه های منطقی گروه بندی می کنند و مدیریت و مقیاس برنامه شما را آسان تر می کنند. توابع Middleware قبل از کنترلکننده مسیر فراخوانی میشوند و به شما امکان میدهند هر کدی را که مستقیماً به درخواست مشتری پاسخ نمیدهد، اجرا کنید. در نهایت، Exception Filters ابزار قدرتمندی برای مدیریت استثناها در سراسر برنامه شما فراهم می کند.
با درک این مفاهیم، می توانید از قدرت کامل NestJS استفاده کنید و برنامه های کاربردی قوی و درجه یک سازمانی ایجاد کنید. به یاد داشته باشید که اینها فقط مفاهیم اساسی هستند. NestJS بسیاری از ویژگیها و تکنیکهای پیشرفتهتر را ارائه میکند که با راحتتر شدن با آن ، میتوانید آنها را بررسی کنید.
امیدوارم این مطالب کمی بهتون کمک کرده باشه:)