الگوی DTO (Data Transfer Object) چیست و چگونه می توان از آن به درستی در NestJS استفاده کرد؟
بررسی کلی:
DTO (Data Transfer Object) یک الگوی طراحی است که معمولاً در توسعه نرم افزار برای انتقال داده ها بین لایه های مختلف یک برنامه استفاده می شود. ایده اصلی پشت الگوی DTO، کپسوله کردن داده ها و ارائه یک روش استاندارد برای انتقال آن بین بخش های مختلف برنامه است.
در عمل، یک DTO یک تب ساده است که حاوی دادهها است و ممکن است منطق اعتبارسنجی داشته باشد. بخشی یا تمام داده های یک شی دامنه را تعریف می کند، معمولاً برای انتقال داده ها بین کاربر و سرور یا بین لایه های مختلف برنامه سمت سرور استفاده می شود. شی DTO معمولاً توسط کد سمت سرور ایجاد می شود، با داده های یک پایگاه داده یا منابع دیگر پر می شود و سپس برای کاربر ارسال می شود. سپس کد سمت سرویس گیرنده می تواند از شی DTO برای نمایش داده ها به کاربر یا ارسال آن به سرور برای پردازش استفاده کند.
کاربردی ساده:
در اینجا مثالی از نحوه استفاده از DTO در یک برنامه NestJS آورده ایم:
1.کلاس DTO خود را تعریف کنید: (users.dto.ts)
2. از کلاس DTO خود در کنترلر خود استفاده کنید:
استفاده دقیق تر از DTO:
DTO طراحی شده است تا به ما کمک کند داده ها را از اشیاء دامنه مختلف سازماندهی کنیم یا فقط بخشی از داده ها را از یک شی دامنه داشته باشیم، علاوه بر این، به ما کمک می کند تا داده ها را اعتبارسنجی کنیم.
به این سناریوها فکر کنید:
1.ثبت نام کاربر:
هنگامی که کاربر برای یک حساب کاربری در یک وب سایت ثبت نام می کند، ممکن است لازم باشد داده ها را از چندین شی دامنه جمع آوری کنید، مانند نام و آدرس ایمیل کاربر از شی User، و آدرس صورتحساب کاربر از شی BillingAddress. با استفاده از یک DTO، میتوانید این دادهها را در یک شی واحد کپسوله کنید و در صورت نیاز آن را در اطراف برنامه خود ارسال کنید.
2.پاسخهای API:
هنگام ساختن یک API، ممکن است بخواهید فقط زیرمجموعهای از دادهها را از یک شی دامنه برگردانید تا مقدار دادهای را که باید از طریق شبکه منتقل شود کاهش دهید. به عنوان مثال، ممکن است یک شی User با ویژگی های زیادی داشته باشید، اما فقط بخواهید نام و آدرس ایمیل کاربر را در پاسخ API برگردانید. با استفاده از یک DTO، میتوانید کلاسی را تعریف کنید که فقط حاوی ویژگیهایی باشد که میخواهید برگردانید، و نمونههایی از این کلاس را از نقاط انتهایی API خود برگردانید.
3.اعتبارسنجی داده ها:
هنگام پذیرش داده ها از یک کاربر ، ممکن است بخواهید قبل از پردازش، تأیید کنید که داده ها در قالب صحیح هستند. با استفاده از یک DTO، میتوانید منطق اعتبارسنجی را در خود کلاس DTO تعریف کنید، که میتواند به کاهش تکرار و حفظ کد شما کمک کند.
تمامی سناریوها با استفاده از class-validator class-transformer در nest.js امکان پذیر هست بریم برای هر کدوم مثال هایی رو ببینیم:
از dto برای اعتبارسنجی درخواست های کاربر استفاده کنیم:
1.کلاس DTO خود را تعریف کنیم و از class-validator برای اعتبار سنجی دیتاهای خودمون استفاده میکنیم:
2.از dto خودمان در کنترلری که نیاز به اعتبار سنجی دیتا ای که از سمت کاربر ارسال میشود استفاده می کنیم:
در مثال بالا از class-validator در dto استفاده کردیم برای اعتبار سنجی هر پراپرتی خودمان برای مثال IsString برای رشته ای بودن تایپ دیتایی که کاربر میفرستد یا MinLength برای مشخص کردن حداقل طول کارکتر پسوورد استفاده میشود و درصورتی که دیتای کاربر با dto اعتبار سنجی نشود با ارور به صورت اتوماتیک بر خواهد خورد.
از dto برای کپسوله کردن داده ها و ارائه یک روش استاندارد استفاده کنیم:
(برای این کار روش خای مختلفی وجود داره که من سعی کردم ساده ترین روش رو به شما معرفی کنم)
1.کلاس DTO خود را تعریف کنیم :
2.از dto خودمان در سرویسی که نیاز به کپسوله کردن داده ها که از دیتابیس ارسال میشود استفاده می کنیم:
در مثال بالا از dto استفاده کردیم برای کپسوله کردن داده ها که از دیتابیس ارسال میشود و ساختار بندی کردن دیتاهایی که با ساختار های مشخص نشده ای از دیتابیس ارسال شوند.
و درنهایت برای استفاده از dto در پروژه های nestjs خودتان در صورت استفاده از class-validator class-transformer برای فعال سازی ان ها در کل پروژه باید به صورت زیر آن را کانفیگ کنید:
Global pipes در NestJS مکانیزمی قدرتمند برای مدیریت اعتبارسنجی و تبدیل دادهها در سطح بالاتری هستند و از مدیریت مداوم دادهها در سراسر برنامه شما اطمینان میدهند. با استفاده از ValidationPipe با class-validator و class-transformer، می توانید قابلیت اطمینان برنامه خود را افزایش دهید، از مشکلات داده غیرمنتظره جلوگیری کنید و پردازش داده ها را روان تر کنید.
نتیجه گیری:
درک و پیادهسازی انتقال داده در برنامههای NestJS میتواند به طور قابل توجهی استحکام، امنیت و قابلیت نگهداری پایگاه کد شما را افزایش دهد. با اتخاذ بهترین روشهای مورد بحث در این وبلاگ، برای مدیریت اعتبارسنجی دادهها، سادهسازی ارتباطات بین لایهها و تقویت برنامهتان در برابر آسیبپذیریهای احتمالی، انجام میدهید. آنها به شما این امکان را می دهند که داده ها را بر اساس نیازهای خاص کاربران خود را شکل دهید. قابلیت های اعتبار سنجی و تبدیل ارائه شده توسط DTO ها تضمین می کند که فقط داده های سالم وارد برنامه شما می شود و به مدیریت بهتر خطا و بهبود تجربه کاربر کمک می کند.
به یاد داشته باشید که استفاده موثر از DTO ها تنها یک تکه از پازل است. همراه شدن این تکنیک با سایر ویژگیهای NestJS، مانند دکوراتورها، رهگیرها و میانافزارها، میتواند به یک معماری برنامهای با ساختار و کارآمد منجر شود. همیشه مقیاس پذیری و نگهداری را در ذهن داشته باشید، زیرا این اصول شما را به سمت نوشتن کدهای تمیزتر و قابل نگهداری تر در طولانی مدت راهنمایی می کند.
امیدوارم این مطالب کمی بهتون کمک کرده باشه:)