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

انواع داده

اگر نوع متغیر را مشخص نکنیم به صورت خودکار نوع داده any به آن اختصاص داده میشود.

let myName:string = "Mokhtar";
let myAge:number = 34;
let hasAnimal:boolean = false;

let newName; // نوع این متغیر به صورت پیشفرض any میباشد

آرایه ها و نوع داده آرایه

let arr:any[]; // این آرایه میتواند شامل هر نوع داده ای باشد
let arr2:number[]; // این آرایه فقط میتواند شامل اعضای عددی باشد
let arr3:string[];// این آرایه فقط میتواند شامل اعضای رشته ای  باشد
let arr4:(string|number)[]; // اعضای این آرایه میتوانند هم عددی و هم رشته ای باشند

نوع داده توپلس Tuples

آرایه که شامل تعداد مشخصی عضو با نوع داده مشخص میباشد.

let address:[string,number];// این آرایه فقط باید 2 عضو داشته باشد که اولی رشته و دومی عددی است
address = ['Tehran',52]; 

مثال دیگر:

let address2:[(string|number),number];
address2 = ['56',52]; 

در مثال فوق تعیین کردیم که عضو اول آرایه میتواند هم رشته و هم عدد باشد.

نوع داده Enum - قابل شمارش

یک نوع داده ای تعریف شده توسط برنامه نویس را که به آن نوع داده شمارش میگویند، ایجاد میکند، نحوه ایجاد یک نوع داده شمارش به صورت زیر است:

enum enumName {const1,const2,const3,...,constn}

به صورت پیشفرض مقداردهی ثابت ها با 0 شروع میشود.

برخی کاربردهای enum مثل: فصل ها، روزهای هفته، رنگ ها، روزهای ماه، ماه های سال

مثال های enum:

enum TrueFalse{
    false, // به صورت خودکار مقدارش برابر 0 است
    true //  به صورت خودکار مقدارش برابر 1 است
}

مثال بعدی:

enum Days{
    SAT = 1,
    SUN,
    MON,
    TUE,
    WED,
    THU,
    FRI
}

در مثال فوق چون مقدار SAT را برابر 1 قرار دادیم، به صورت خودکار مقادیر بعدی 2و3 و ..7 میشوند.

* نکته : بهتر است ثابت ها را با حروف بزرگ تعریف کنیم تا با متغیرها اشتباه نشوند.

enum Colors{
    BLACK = 2,
    GREEN = 4,
    RED = 3,
    BLUE = 5,
    GRAY, // مقدار ندارد اما چون مقدار قبلی 5 است ، مقدار 6 به آن تعلق میگیرد
    WHITE = 0
}

در ضمن میتوانیم نوع داده فوق را به یک متغیر اختصاص دهیم که یعنی متغیر ما از نوع Colors است و فقط مقداری از همین نوع را میپذیرد.مثال:

let myColor:Colors = Colors.RED;
console.log(myColor)

نوع داده Any

اگر به یک متغیر هیچ نوع داده ای ندهیم. نوع اولین مقدار به آن اختصاص پیدا میکند و اگر بعداً این نوع تغییر کند کامپایلر خطا میگیرد. اما اگر از همان ابتدا نوع داده any را به آن بدهیم هیچ مشکلی بوجود نمی آید.

let car:any= "BMW";
console.log(car);
car = {brand:"BMW",series:3};
console.log(car)

نوع داده Never

نوع داده Never میگوید که هیچ دستوری قرار نیست اجرا شود و هیچ داده ای قرار نیست برگشت داده شود. هیچوقت. مثال:

function errorLog():never{
    throw new Error('این یک پیغام خطای سفارشی است');
}

مجوز داشتن چندین نوع

در صورت لزوم با استفاده از | نوع داده هایی که یک متغیر میتواند داشته باشد را مشخص میکنیم تا متغیر ما محدود به یک نوع داده نباشد.

let orType:string|number|boolean|number[]|object;

نکته مهم : 

اگر یک متغیر میتواند مقدار null داشته باشد باید مشخص کنیم.مثال:

let canBeNull:number|null;
    canBeNull = 12;
    canBeNull = null;

یا اینکه در تنظیمات کامپایلر مشخص کنیم که متغیرهایی که نوع داده null گرفته اند، چشم پوشی کند. یا کلا null رو بی خیال شود و خطا نگیرد.

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

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 یا هر ماژول دیگر ایجاد شده در برنامه باشد. موارد بیشتر در بخش ماژول ها توضیح داده خواهد شد.