تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۰۲:۳۱ ق.ظ نویسنده: محمدیان

DTO - آبجکت انتقال داده

Data transfer object DTO - آبجکت انتقال داده ها آبجکتی است که نحوه ارسال داده ها از طریق شبکه را مشخص می کند.

Interfaces - اینترفیس

اینترفیس های TypeScript برای بررسی نوع و تعریف انواع داده هایی که می توانند به یک کنترلر یا یک سرویس Nest منتقل شوند ، استفاده می شوند.

Dependency injection - تزریق وابستگی

تزریق وابستگی یک الگوی طراحی است که برای افزایش کارایی و مدولار کردن پروژه کاربرد دارد. اغلب توسط فریمورک ها برای تمیز نگه داشتن کد و استفاده راحت تر از آن استفاده می شود. همچنین Nest.js از آن استفاده می کند تا در اصل اجزای قطعه قطعه با کامپوننت ها ایجاد کند.

با استفاده از این الگو، مدیریت وابستگی های بین اجزای پروژه مانند کنترلر ها، سرویس ها و ماژول ها بسیار آسان میشود. تنها مورد لازم برای تعریف وابستگی به عنوان مثال UsersService () در سازنده کنترلر است که در اینجا نشان داده شده است:

...
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService){}
 ...
}

با استفاده از برخی از این مفاهیم که مختصراً پوشش داده شده است ، اکنون می توانید به بخش بعدی بروید ، جایی که شما می توانید تمام دانش به دست آمده در این پست را استفاده کنید زیرا چگونگی یکپارچه سازی API RESTful را با استفاده از Nest.js یاد خواهید گرفت.

تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۰۱:۳۵ ق.ظ نویسنده: محمدیان

ماژول ها رو میتوان گفت که یکی از مهمترین سنگ بناهای ساختار nestjs هستند. ماژول همان فایلهای Typescript هستند که با module@ دکوریت شدند. این دکوراتور متصل به کلاس، ابرداده ای را ایجاد می کند که Nest برای سازماندهی ساختار برنامه از آن استفاده می کند. با ماژول ها به راحتی می توانیم فایل های مرتبط به هم را اعم از کنترلرها، سرویسها و ... در یک گروه قرار دهیم.

هر برنامه Nest.js باید حداقل یک ماژول داشته باشد که معمولاً به آن ماژول ریشه گفته می شود. این ماژول ریشه ماژول سطح بالایی است که معمولاً برای یک برنامه کوچک کافی است اما توصیه می شود یک برنامه بزرگ را در چندین ماژول بشکنید زیرا این امر به حفظ ساختار برنامه کمک می کند.

 

اگر برنامه ای دارید که داده ها یا متودهای زیادی را در مورد کاربران مدیریت می کند ، می توانیم کنترلر ، سرویس ها و سایر پرونده های مرتبط را در یک ماژول واحد قرار دهیم ، و به عنوان مثال بگوییم UsersModule:

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller.ts';
import { UsersService } from './users.service.ts';

@Module({
  controllers: [UsersController],
  providers: [UsersService]
})

export class UsersModule {}

از فایل قبلی ، یک UsersModule صادر می شده که هم شامل UsersController و هم UsersService است. با استفاده از این کار ، می توانیم همانطور که در قطعه کد زیر نشان داده شده است از UsersModule درون ماژول ریشه برنامه استفاده کنیم:

...
import { UsersModule } from './users/users.module';

@Module({
  ...
})

export class AppModule { }

 

تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۰۱:۲۵ ق.ظ نویسنده: محمدیان

همانطور که قبلاً نیز اشاره شد ، Nest.js به شدت از Angular الهام گرفته است و شبیه برنامه های Angular است ، می توان به راحتی یک سرویس را ایجاد کرد و آن را به کنترلرها یا سایر سرویس ها نیز تزریق کرد. به این سرویس ها، Provider نیز گفته می شود به معنی ارائه دهنده و براساس فلسفه Nest.js ، اینگونه طراحی شده است تا هر نوع پیچیدگی و منطق برنامه را در کلاسهایی بنام service قرار بدهد.

 

سرویس ها در Nest.js فقط یک کلاس جاوا اسکریپت معمولی هستند که یک دکوراتور مخصوص Injectable () به بالای آن اضافه میشود.

 

به عنوان مثال ، می توانید همانطور که در شکل زیر مشاهده می کنید ، یک سرویس برای دریافت لیست کاربران ایجاد کنید:

// users.service.ts

import { Injectable } from '@nestjs/common';
import { User } from './interfaces/user.interface';

@Injectable()
export class UsersService {
  private readonly users: User[] = [];

  create(user: User) { 
    this.users.push(user);   }

  findAll(): User[] {
    return this.users;
  }
}

سرویس فوق دارای دو متود create و findeAll است. که میتواند به ترتیب برای ایجاد و دریافت لیست کاربران مورد استفاده قرار گیرد. از اینترفیس هم برای نوع داده استفاده کردیم تا به صورت خودکار آن را بررسی شود و هنگام کدنویسی هم خودمان بدانیم که خواص و متودهای هر آبجکت user چه هستند.

تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۰۱:۰۴ ق.ظ نویسنده: محمدیان

مثل اکثر فریمورکهای برنامه نویسی تحت وب، کنترل کننده های Nest.js نیز مسئولیت رسیدگی به درخواست های دریافتی کاربر و ارسال پاسخ به طرف کلاینت را دارند. به عنوان مثال ، اگر یک API به یک نقطه پایانی خاص ، مثلاً (home/) خانه اشاره کند ، کنترلر این درخواست را دریافت می کند و بر اساس منابع موجود ، پاسخ مناسب را بر می گرداند.

Nest.js به شکلی ساخته شده است که مکانیسم مسیریابی قادر باشد بفهمد که کدام کنترلر مسئولیت رسیدگی به یک درخواست خاص را بر عهده دارد.

تعریف یک کنترلر اصلی در Nest.js به سادگی ایجاد یک فایل TypeScript است که شامل یک دکوراتور Controller مانند قطعه کد زیر میشود:

// users.controller.ts 

import { Controller, Get } from '@nestjs/common';

@Controller('users')
export class UsersController {
 @Get()
 findAll() { 
   return 'This will return all the users';
 }
}

برچسب users در داخل دکوراتور UsersController، کنترلر را وادار می کند تا هر درخواست GET که از سمت کاربر آمد را رسیدگی کند و پاسخی را که مشخص شده است ، برگرداند. سایر درخواست های HTTP که توسط کنترل کننده میتواند کنترل  شود شامل POST ، PUT ، DELETE است که بعداً در این آموزش خواهیم دید.

پس از ایجاد یک کنترلر ، برای اینکه Nest.js بتواند آن کنترلر رابشناسد، باید در تعریف ماژول اضافه شود. این ماژول می تواند ماژول اصلی ApplicationModule یا هر ماژول دیگر ایجاد شده در برنامه باشد. موارد بیشتر در بخش ماژول ها توضیح داده خواهد شد.

 

تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۱۲:۵۸ ق.ظ نویسنده: محمدیان

Nest.js یک چارچوب Node.js سمت سرور برای ساختن برنامه های کارآمد ، قابل اعتماد و مقیاس پذیر است و مورد حمایت بسیاری از سازمانها و افراد معتبر قرار گرفته است.

Nest.js برای حل مشکل معماری Node.js با ارائه برنامه های پشتیبان یک ساختار مدولار برای سازماندهی کد در ماژول های جداگانه معرفی کرده است.

کاملاً با TypeScript ساخته شده است ، دارای مزایای بررسی نوع کد و تزریق وابستگی است که به تسهیل روند توسعه برنامه ها کمک می کند. اگر با ساختار برنامه های Angular آشنا هستید ، می توانید با مفاهیم کلیدی Nest.js احساس راحتی کنید و شروع کار با آن کار ساده ای خواهد بود. به هر حال ، این پست جزئیات لازم را برای شروع ساختن برنامه های کاربردی با Nest.js. برای شما فراهم می کند.

علاوه بر این ، لیست زیر برخی از مزایای Nest.js را توضیح داده است :

  • با استفاده از بلوک های try , catch کنترل کننده مسیر شما را احاطه کرده میکند.
  • هر کدام از هندلرهای مسیریاب به صورت async کار میکنند.
  • مسیریاب بر پایه فریمورک اکسپرس در کل برنامه فعالیت میکند.
  • یک مسیریاب جدا از هم برای هر کنترلر ایجاد می کند
  • واسطه یا میان افزار (middleware) مدیریت خطا را برای کل برنامه ایجاد میکند و زحمت ایجاد آن بر دوش شما نیست.
  • واسطه یا میان افزار body-parser که حتما با آن آشنا هستید، در کل برنامه قابل استفاده است. (هم json و هم urlencoded)

اکنون که به مزایای این چارچوب جالب توجه پی بردید. در پست های بعدی به ترتیب راجع به اجزای ساختاری Nestjs پرداخته خواهد شد.

 

 

 

 

تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۱۲:۲۷ ق.ظ نویسنده: محمدیان

نست فریمورکی برای ساختن اپلیکشن های بک اند در NodeJs هست که با TypeScript ساخته شده و بطور کامل ازش پشتیبانی میکنه و همچنین قابلیت های کار با وب سوکت، GraphQl ،Rest و ... رو برامون فراهم میکنه.

در لایه های زیرین خودش از فریمورک ExpressJs بطور پیشفرض استفاده میکنه و همچنین میتونید بجای اکسپرس از Fastify هم استفاده کنید. در واقع یک لایه ابسترکشن روی فریمورکهای express یا fastify هست و در عین حال امکان این رو بهمون میده که مستقیما با api های این فریمورک ها هم کار کنیم و خوبیش اینه که میتونیم از لایبری ها و ماژول هایی که برای این فریمورک ها هست به راحتی استفاده کنیم.

چرا بجای اکسپرس از نست استفاده کنیم؟

یکی از دلایل میشه گفت وجود نداشتن ساختار و استانداردی در پروژه های nodejs هست. هر موقع که وارد یک پروژه جدید نود میشیم احتمال زیاد با یک ساختار متفاوت رو به رو میشیم مثلا بعضی ها ممکنه فقط از یک فایل استفاده کرده باشند ! یا بعضیا از معماری MVC و خیلی چیزای دیگه. این حالت بیشتر واسه کسایی که تازه کار هستن و زیاد با معماری ها و ساختارها آشنا نیستن میتونه گیج کننده باشه و در کل احتمال تولید کد کثیف و غیرقابل نگهداری با گذشت زمان بیشتر میشه که در نهایت کار توسعه رو سخت تر و زمانبر میکنه.

نست فقط یک ساختار و معماری رو بهمون معرفی میکنه و میگه که فقط توی این قالب و استایل کد بزنین.

کامپوننت ها معماری یک اپلیکشن نست به این صورته:

  • کنترلر ها (Controllers)
  • ماژول ها (Modules)
  • پروایدر Provider ها (services, repositories, factories, helpers , ...)
  • کلاس های DTO
  • کلاس های مدل (Entities)

دلیل اصلی استفاده از این معماری و ساختار این هست که اپلیکشن رو به بخش های کوچیکی بشکنیم. یادگیری و کارکردن به این شیوه برای کسایی که انگولار یا spring boot کار کردن میتونه ساده باشه.

در ادامه به معرفی این کامپوننت ها بصورت اجمالی میپردازیم.


کنترلر ها (Controllers):

هدف اصلی دریافت درخواست از کاربر یا هرچیزی دیگه ای هست و فرستادنش به کامپوننت سرویس ها (business logic) برای انجام کار مورد نظر و سپس برگرداندن پاسخ.

ماژول ها (Modules):

ماژول مثل یک کانتینر هست که بقیه بخش هایی که بهم مرتبط هستن رو در خودش نگه میداره .

مثلا یک ماژول بنام user فقط شامل سرویس ها و کنترل ها و ... مخصوص و مرتبط کار با یوزر هاست و به این صورت بخش های مختلف اپ رو جداسازی میکنه.

پروایدر ها Providers:

این بخش مقداری عمومی هستش و میتونه شامل ریپازیتوری مدل های دیتابیس، سرویس، کلاس های helper و ... باشه. ایده کلی پرواید ها اینه که میتونه در جاهای مختلف به صورت وابستگی تزریق بشه، مثل یک کانکشن دیتابیس که میتونه در بخش ها و کلاس های مختلفی تزریق بشه و امکان کار کردن با دیتابیس رو بده. در واقع سرویس ها شامل business logic و منطق برنامه هستن که میتونن در هرجایی استفاده بشن.

کلاس های DTO:

این بخش که مخفف Data Transfer Object هست یک ساختار و فرمت برای داده هایی که در یک اندپوینت (route) از کاربر دریافت میشه تعیین میکنه. مثلا میخواید که کاربر سن رو بصورت عدد براتون بفرسته یا نام بصورت یک رشته باشه. که با ترکیب اینها با لایبری هایی مثل class-validator میتونیم بعنوان ولیدشن هایی قوی ازشون استفاده کنیم و داده های ورودی کاربر رو کنترل کنیم.

مدل ها (Entities):

مدل ها جایی هستن که اطلاعات مربوط به دیتابیس رو توی اون ها میسازیم مثلا با استفاده از typeorm که یک ORM کاملا سازگار با تایپ اسکریپت هست میتونیم یک کلاس مدل بسازیم و جدول دیتابیس رو بدون یک خط کد SQL و فقط با کد تایپ اسکریپت درست کنیم.

سخن پایانی:

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

میتونید به سایت nestjs مراجعه کنید که داکیومنتش خیلی خوب توضیح داده و به راحتی میتونید از اونجا یاد بگیرید.