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

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

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

برای دسترسی به هر صفحه وب باید یک وب سرور داشته باشید. یک سرور قادر است تا درخواست های HTTP را دریافت کرده و با کمک کد ها شما، پاسخ را به کاربر ارسال کند.

به عنوان مثال در زبان asp.net وب سرور IIS مورد استفاده قرار می گیرد و برای اجرای کد های جاوا یا PHP وب سرورهایی مانند apache وجود دارد.

نود.جی اس به شما این امکان را می دهد تا وب سرور خودتان را با چند خط کد ساده ایجاد کنید و درخواست های HTTP را به صورت ناهمگام (asynchronous) پاسخ دهید.

شما می توانید از وب سرورهای IIS و آپاچی نیز برای اجرای کدهای Node.js استفاده کنید گرچه این کار پیشنهاد نمی شود.

ساخت یک وب سرور با استفاده از Node.js

نود.جی اس به سادگی قادر است تا یک وب سرور را برای مدیریت درخواست های ورودی راه اندازی کند.

مثال زیر نشان می‌دهد که شما چگونه می توانید یک وب سرور را در فایلی به نام server.js به کمک Node.js بسازید و اجرا کنید:

var http = require('http'); // 1 - Import Node.js core module

var server = http.createServer(function (req, res) {   // 2 - creating server

    //handle incomming requests here..

});

server.listen(5000); //3 - listen for any incoming requests

console.log('Node.js web server at port 5000 is running..')

فصل ۱۰ – مثال ۱ (فایل server.js)

در مثال بالا ما ماژول http را به کمک فانکشن require() در فایل ایمپورت کرده ایم.

ماژول http یک ماژول هسته ای برای Node.js است پس نیازی نیست که آن را به کمک این NPM نصب کنید.

قدم بعدی این است که متود createServer() تعبیه شده درون http را با پارامتر های req و res صدا بزنیم، این دو متغیر حاوی اطلاعات درخواست (request) و پاسخ (response) خواهند بود. مقدار بازگردانده شده را به متغیر server انتساب خواهیم داد، زیرا همچنان با این سرور ایجاد شده کار داریم.

در نهایت ما باید متود listen() از متعلقات متود createServer() را صدا بزنیم. این کار با کد server.lister(port) انجام می شود. port در اینجا عدد پورتی که به اپلیکیشن می خواهید اختصاص دهید خواهد بود.

پورت اصلی سرور ها ۸۰ است و نیاز به تایپ کردن ندارد، اگر پورت چیزی غیر از ۸۰ باشد باید با دو نقطه پس از آدرس در مرورگر وارد شود. مثلا localhost:8080 باید وارد شود ولی localhost:80 را می شود به صورت localhost استفاده کرد.

کد server.listen(5000) به نود.جی اس می گوید که به پورت ۵۰۰۰ سرور توجه کند. مثلا هر درخواستی که به آدرس localhost:5000 ارسال شد را دریافت کند.

در مثال بالا ما همچنان به سیستم نگفته ایم که در صورتی که درخواست را دریافت کرد چه پاسخی به آن بدهد.

برای اجرای کد های بالا فقط کافی است در محیط ترمینال یا CMD کد node server.js را تایپ کنید.

پس از اجرای کد پاسخ Node.js web server at port 5000 is running.. از سیستم دریافت خواهد شد.

حالا که ساختن یک وب سرور را آموختید بگذارید به شما نشان دهیم که چگونه می توانید پاسخ درخواست ها را نیز ارسال کنید. اگر پاسخی به درخواست ها ارسال نکنید کاربر در صورت ارسال درخواست در مرورگر صفحه ای مشاهده نخواهد کرد.

مدیریت درخواست های HTTP در Node.js

در متود http.createServer() دو پارامتر response و request تعبیه شده است که برای مدیریت پاسخ های HTTP مورد استفاده قرار می گیرند.

آبجکت request حاوی اطلاعاتی در مورد درخواست ارسال شده به سرور است. اطلاعاتی مانند آدرس درخواستی، header های ارسالی با درخواست و data در این آبجکت وجود دارد.

ابجکت response را می توان برای ارسال پاسخ متناسب به درخواست استفاده کرد.

مثال زیر نشان می‌دهد که شما چگونه می توانید یک درخواست HTTP را با کمک Node.js مدیریت کنید:

var http = require('http'); // Import Node.js core module

var server = http.createServer(function (req, res) {   //create web server
    if (req.url == '/') { //check the URL of the current request
        
        // set response header
        res.writeHead(200, { 'Content-Type': 'text/html' }); 
        
        // set response content    
        res.write('This is home Page.');
        res.end();
    
    }
    else if (req.url == "/student") {
        
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.write('This is student Page.');
        res.end();
    
    }
    else if (req.url == "/admin") {
        
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.write('This is admin Page.');
        res.end();
    
    }
    else
        res.end('Invalid Request!');

});

server.listen(5000); //6 - listen for any incoming requests

console.log('Node.js web server at port 5000 is running..')

فصل ۱۰ – مثال ۲ (فایل server.js)

در مثال بالا req.url استفاده شده است تا اپلیکیشن آدرس درخواستی کاربر را تشخیص دهد.

برای ارسال پاسخ متناسب با درخواست کاربر ابتدا ما باید Header مناسب را با متود writeHead() به پاسخ اضافه کنیم و سپس با استفاده از متود write() متنی را بر روی صفحه چاپ کنیم.

در نهایت در هنگامی که Node.js با متود end() برخورد می کند اطلاعات را نشان خواهد داد.

پس از اجرای کد پاسخ Node.js web server at port 5000 is running.. از سیستم دریافت خواهد شد.

اکنون می توانید در مرورگر خود آدرس http://localhost:5000 را باز کرده و متن This is home page را مشاهده کنید

اگر شما آدرس http://localhost:5000/student را در مروگر باز کنید نتیجه زیر را مشاهده خواهید کرد:

در حال حاضر هر درخواست دیگری به سرور نتیجه ” Invalid Request” خواهد داشت.

ارسال پاسخ JSON به درخواست های HTTP در Node.js

مثال زیر نشان می دهد چگونه می توانید پاسخ JSON به درخواست های HTTP ارسال کنید:

var http = require('http'); 

var server = http.createServer(function (req, res) {   
   
    if (req.url == '/data') { //check the URL of the current request
            res.writeHead(200, { 'Content-Type': 'application/json' });
            res.write(JSON.stringify({ message: "Hello World"}));  
            res.end();  
    }
});

server.listen(5000);

console.log('Node.js web server at port 5000 is running..')

فصل ۱۰ – مثال ۳ (فایل server.js)

اگر بعد از اجرای مثال بالا، آدرس http://localhost:5000/data را در مرورگر باز کنید، با جمله Hello World در قالب JSON مواجه خواهید شد.

 

 

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

خواندن فایل ها با استفاده از ماژول fs در Node.js

شما می توانید با استفاده از متود fs.readFile() یک فایل را به صورت ناهمگام بخوانید.

سینتکس زیر نحوه تعریف یک متد خواندن فایل را با استفاده از ماژول fs در Node.js نشان می دهد:

fs.readFile(fileName [,options], callback)

توضیح پارامترهای سینتکس بالا:

filename: آدرس کامل یا همان full path فایلی که قرار است خوانده شود. (در قالب رشته)

options: این پارامتر می‌تواند یک رشته و یا Object باشد که حاوی encoding و flag است. encoding پیشفرض برابر utf8 و flag برابر r است. (بعدا بیشتر توضیح می دهیم)

callback: یک فانکشن است که دو پارامتر err و fd را دریافت می کند. پارامتر err حاوی پیغام های خطا و پارامتر fd حاوی اطلاعات درون فایل خواهد بود.

مثال زیر نشان می دهد که چگونه می توانیم اطلاعات فایلی به نام TestFile.txt که در کنار اسکریپت ما قرار دارد را به صورت ناهمگام بخوانیم:

var fs = require('fs');

fs.readFile('TestFile.txt', function (err, data) {
                    if (err) throw err;

    console.log(data);
});

فصل ۱۱ – مثال ۱

هنگامی که از ناهمگام بودن نحوه خواندن اطلاعات از فایل ها صحبت می کنیم منظورمان این است که ابتدا نرم افزار شروع به خواندن اطلاعات فایلها می کند و پس از اتمام فعالیت خود فانکشن callback را صدا می زند.

در مثال بالا پارامتر err در صورتی که فایل موجود نباشد حاوی مقداری خواهد بود. در غیر این صورت پارامتر data اطلاعات فایل را دارا می باشد.

به عنوان مثال در کنار فایل js مثال بالا، فایلی ایجاد کنید به نام TextFile.txt که حاوی متن Hello word باشد.

سپس در محیط ترمینال یا CMD با زدن دستور node server.js، فایل اصلی را اجرا کنید.

در صورتی که مشکلی وجود نداشته باشد باید متن Hello word را در محیط کنسول مشاهده کنید.

همچنین می توانید با استفاده از متود fs.readFileSync() به صورت همگام اطلاعات را بخوانید.

مثال زیر نشان می دهد که چگونه می توانید با استفاده از متود fs.readFileSync() یک فایل را به صورت همگام یا synchronous بخوانید:

var fs = require('fs');

var data = fs.readFileSync('TestFile.txt', 'utf8');
console.log(data);

فصل ۱۱ – مثال ۲

نوشتن بر روی فایل با استفاده از ماژول fs در Node.js

نوشتن بر روی یک فایل به همان سادگی خواندن فایل ها در Node.js است. با استفاده از متود fs.writeFile() قادر هستید تا بر روی یک فایلی که در حال حاضر موجود است اطلاعاتی را بنویسید.

سینتکس نگارش متود fs.writeFile() به شرح زیر است:

fs.writeFile(filename, data[, options], callback)

توضیح پارامترهای سینتکس بالا:

filename: آدرس کامل یا همان full path فایلی که قرار است بر روی آن متنی شود. (در قالب رشته)

data: اطلاعاتی که باید درون فایل نوشته شود.

options: این پارامتر می‌تواند یک رشته و یا Object باشد که حاوی encoding و flag است. encoding پیشفرض برابر utf8 و flag برابر r است. (بعدا بیشتر توضیح می دهیم)

callback: یک فانکشن است که دو پارامتر err و fd را دریافت می کند. پارامتر err حاوی پیغام های خطا و پارامتر fd حاوی اطلاعات درون فایل خواهد بود.

مثال زیر یک فایل به نام test.txt ایجاد خواهد کرد و به صورت ناهمگام متن “Hello World” را درون آن خواهد نوشت:

var fs = require('fs');

fs.writeFile('test.txt', 'Hello World!', function (err) { 
                        if (err)
        console.log(err);
                        else
        console.log('Write operation complete.');
});

فصل ۱۱ – مثال ۳

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

اگر می خواهید که اطلاعات درون یک فایل پاک نشود و اطلاعات جدید بعد از اطلاعات حال حاضر درون این فایل قرار بگیرد می توانید از متود fs.appendFile() استفاده کنید.

مثال زیر نشان می دهد که چگونه می توانید جمله “Hello Word!” را بعد از هر چیزی که درون فایل test.txt وجود دارد بنویسید:

var fs = require('fs');

fs.appendFile('test.txt', 'Hello World!', function (err) { 
                        if (err)
        console.log(err);
                        else
        console.log('Append operation complete.');
});

فصل ۱۱ – مثال ۴

باز کردن یک فایل با ماژول fs در Node.js

به صورت آلترناتیو نسبت به متود های بالا شما میتوانید از متود fs.open() در باز کردن یک فایل برای خواندن یا نوشتن بر روی آن استفاده کنید.

سینتکس متود fs.open() به شرح زیر است:

fs.open(path, flags[, mode], callback)

توضیح پارامترهای سینتکس بالا:

path: آدرس کامل یا همان full path فایلی که قرار است باز شود. (در قالب رشته)

flag: پرچم عملیاتی که قرار است بر روی فایل صورت پذیرد. (در ادامه آموزش جدول کل پرچم های ممکن را می توانید مشاهده کنید)

mode: انتخاب حالت باز کردن فایل برای خواندن، نوشتن یا خواندن-نوشتن فایل.

callback: یک فانکشن است که دو پارامتر err و fd را دریافت می کند. پارامتر err حاوی پیغام های خطا و پارامتر fd حاوی اطلاعات درون فایل خواهد بود.

پرچم های قابل استفاده درون فانکشن های مرتبط با فایل در Node.js:

پرچم توضیحات
r یک فایل را برای خواندن باز می کند، اگر فایل موجود نباشد ارور ایجاد می شود.
r+ یک فایل را برای خواندن و نوشتن باز می کند، اگر فایل موجود نباشد ارور ایجاد می شود.
rs فایل را برای خواندن همگام باز می کند.
rs+ یک فایل را برای خواندن و نوشتن باز می کند، این فلگ به سیستم اعلام می کند که این کار را به صورت همگام انجام دهد.
w یک فایل را برای نوشتن باز می کند. اگر فایل موجود نباشد آن را می سازد، اگر فایل موجود باشد آن را ابتدا خالی می کند.
wx مثل w عمل می کند، اما اگر path موجود باشد ارور ایجاد خواهد شد.
w+ یک فایل را برای نوشتن و نوشتن باز می کند. اگر فایل موجود نباشد آن را می سازد، اگر فایل موجود باشد آن را ابتدا خالی می کند.
wx+ مثل w+ عمل می کند، اما اگر path موجود باشد ارور ایجاد خواهد شد.
a یک فایل را برای اضافه کردن چیزی به انتهای آن باز می کند.
ax مثل a عمل می کند، اما اگر path موجود باشد ارور ایجاد خواهد شد.
a+ یک فایل را برای اضافه کردن چیزی به انتهای آن و خواندن آن باز می کند. اگر فایل موجود نباشد ایجاد خواهد شد.
ax+ مثل a+ عمل می کند، اما اگر path موجود باشد ارور ایجاد خواهد شد.

مثال زیر یک فایل از قبل موجود را باز می کند و اطلاعات درون آن را می خواند:

var fs = require('fs');

fs.open('TestFile.txt', 'r', function (err, fd) {
    
                            if (err) {
                            return console.error(err);
    }
    
                            var buffr = Buffer.alloc(1024);
    
    fs.read(fd, buffr, 0, buffr.length, 0, function (err, bytes) {
       
                            if (err) throw err;
            
                            // Print only read bytes to avoid junk.
                            if (bytes > 0) {
            console.log(buffr.slice(0, bytes).toString());
        }
        
                            // Close the opened file.
        fs.close(fd, function (err) {
                            if (err) throw err;
        });
    });
});

فصل ۱۱ – مثال ۵

حذف فایل با ماژول fs در Node.js

حذف فایل ها در Node.js بسیار ساده انجام می شود اما در مورد حذف حتما مراقب باشید.

شما می توانید با استفاده از متود fs.unlink() یک فایل را از سیستم حذف کنیم.

سینتکس استفاده از متود fs.unlink() برای حذف فایلها در Node.js به شرح زیر است:

fs.unlink(path, callback);

مثال زیر نشان می دهد که چگونه می توانید یک فایل را در نود حذف کنید:

var fs = require('fs');

fs.unlink('test.txt', function () {
    
    console.log('deleting operation complete.');

});

فصل ۱۱ – مثال ۶

متود های قابل استفاده در ارتباط با فایل ها در Node.js

fs.readFile(fileName [,options], callback)

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

fs.writeFile(filename, data[, options], callback)

اطلاعاتی را در یک فایل می نویسد. اگر فایل موجود باشد اطلاعات اولیه را پاک کرده و سپس متن را درون آن می نویسد و اگر فاییل موجود نباشد، ابتدا آن را ایجاد می کند و سپس اطلاعات را درون آن قرار می دهد.

fs.open(path, flags[, mode], callback)

فایل را برای خواندن و نوشتن باز می کند.

fs.rename(oldPath, newPath, callback)

یک فایل که از قبل وجود دارد را تغییر نام می دهد.

fs.chown(path, uid, gid, callback)

عملیات chown را به صورت نا همگام انجام می دهد.

fs.stat(path, callback)

آبجکت fs.stat را باز می گرداند که حاوی اطلاعات مهمی از فایل درخواستی است.

fs.link(srcpath, dstpath, callback)

به صورت ناهمگام فایل ها را لینک می کند.

fs.symlink(destination, path[, type], callback)

به صوت ناهمگام Symlink برای فایل ایجاد می کند.

fs.rmdir(path, callback)

یک دایکتوری که از قبل وجود دارد را تغییر نام می دهد.

fs.mkdir(path[, mode], callback)

یک دایرکتوری جدید را ایجاد می کند.

fs.readdir(path, callback)

محتوای یک دایرکتوری درخواستی را می خواند.

fs.utimes(path, atime, mtime, callback)

timestamp یک فایل را تغییر می دهد.

fs.exists(path, callback)

مشخص می کند آیا فایل درخواستی وجود دارد یا نه.

fs.access(path[, mode], callback)

قابلیت دسترسی کاربر به فایلی را مشخص می کند.

fs.appendFile(file, data[, options], callback)

مقداری متن جدید به انتهای فایلی که از قبل وجود دارد اضافه می کند.

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

برنامه نویسی Node.js با ماژول ها، برنامه نوشته شده را بسیار خوانا تر می کند. معمولا ماژول فقط یک کار خاص را انجام می دهند و بار ها در طول اپلیکیشن مورد قابل استفاده قرار می گیرند. یک ماژول معمولا حاوی یک عملیات خاص می باشد که به صورت مستقل قادر به انجام هدف خود است.

در فصل قبلی ما دیدیم که چگونه می توانید با استفاده از module.exports یک ماژول لوکال را اکسپورت کنید (برای استفاده در تمامی اپلیکیشن، ماژول را معرفی کنید). اکنون می خواهیم نشان دهیم که چگونه می توانید ماژول های مختلف از انواع مختلف را با استفاده از module.exports اکسپورت کنید.

module.exports یا exports دو شی  خاص هستند که در تمامی فایلهای جاوا اسکریپت Node.js به طور پیش فرض وارد می شوند.

در module.exports درواقع کلمه module یک متغیر است که اشاره به ماژولی که درون آن هستیم دارد و کلمه exports یک شی است که این ماژول را برای کل اپلیکیشن به عنوان یک ماژول در دسترس معرفی خواهد کرد.

هر چیزی که شما به module.exports اختصاص دهید به عنوان یک ماژول به اپلیکیشن معرفی خواهد شد.

معرفی مقدار Literal به عنوان ماژول (خروجی گرفتن از Literal)

همانطور که در بالا اشاره کردیم exports یک شی یا همان object است. پس این شی هر چیزی که به آن اختصاص دهید را در اختیار کل اپلیکیشن قرار خواهد داد. پس در نتیجه اگر شما یک مقدار رشته را به این شیء اختصاص دهید آن رشته به عنوان یک ماژول به اپلیکیشن معرفی خواهد شد.

مثال زیر نشان می‌دهد که شما چگونه می توانید یک مقدار رشته را به عنوان یک ماژول به سیستم معرفی کنید. بهتر است فایلی به نام Message.js بسازید و فقط کد زیر را درون آن قرار دهید:

module.exports = 'Hello world';

//or

exports = 'Hello world';

فصل ۸ – مثال ۱ (فایل Message.js)

اکنون ماژولی که ساختید را درون فایل app.js با فانکشن require() فراخوانی کنید. مانند مثال زیر:

var msg = require('./Messages.js');

console.log(msg);

فصل ۸ – مثال ۱ (فایل app.js)

اگر دقت کنید قبل از اسم فایل نقطه و اسلش قرار گرفته است. ./ درواقع به همان فولدر که درون آن هستیم اشاره دارد. البته برای استفاده از ماژول های هسته ای نیاز به مشخص کردن path یا همان مسیر فایل ها ندارید.

برای اجرای مثال بالا می توانید در محیط ترمینال یا CMD دستور node app.js را تایپ کرده و اینترنت بزنید. (دقت کنید که در محیط ترمینال ابتدا باید با دستور cd به مکانی که فایل را ساخته اید نقل مکان کنید.)

معرفی Object به عنوان ماژول (خروجی گرفتن از Object)

exports یک object است پس می توانید به آن صفت یا متود اختصاص دهید.

مثال زیر نشان می دهد که شما چگونه می توانید یک رشته را به عنوان صفت به یک آبجکت اختصاص دهید و object را اکسپورت کنید. بهتر است فایلی به نام Message.js ساخته و کد زیر را درون آن کپی کنید:

exports.SimpleMessage = 'Hello world';

//or

module.exports.SimpleMessage = 'Hello world';

فصل ۸ – مثال ۲ (فایل Message.js)

در مثال بالا ما صفت SimpleMessage را به شی export اختصاص داده ایم.

شما اکنون می توانید ماژول ساخته شده را در فایل app.js به شکل زیر مورد استفاده قرار دهید:

var msg = require('./Messages.js');

console.log(msg.SimpleMessage);

فصل ۸ – مثال ۲ (فایل app.js)

در مثال بالا فانکشن require() آبجکت { SimpleMessage : 'Hello World'} را باز می گرداند. پس شما می توانید با استفاده از نام متغیر اختصاص داده شده به این ماژول، صفت های درون آن را صدا بزنید. مانند: msg.SimpleMessage

مثال بالا را با استفاده از node app.js در ترمینال اجرا کنید.

به همین سبک بالا می توانید یک فانکشن را به همراه آبجکت اکسپورت کنید.

مثال زیر نشان می دهد که شما چگونه می توانید فانکشن لاگ را به همراه یک شی به عنوان یک ماژول اکسپورت کنید، این کد ها را در فایل Log.js ذخیره کنید:

module.exports.log = function (msg) { 
    console.log(msg);
};

فصل ۸ – مثال ۳ (فایل Log.js)

مثال بالا در واقع آبجکت { log : function(msg){ console.log(msg); } } را در هنگام استفاده از require() باز خواهد گرداند. پس شما می توانید با استفاده از نام متغیر اختصاص داده شده به متود های درونی آن دسترسی پیدا کنید.

به مثال زیر توجه کنید، این کد ها محتویات فایل app.js است:

var msg = require('./Log.js');

msg.log('Hello World');

فصل ۸ – مثال ۳ (فایل app.js)

مثال بالا را با استفاده از node app.js در ترمینال اجرا کنید.

شما می توانید به روش زیر نیز یک object را به عنوان ماژول اکسپورت کنید. بهتر است فایلی به نام data.js ساخته و متن زیر را درون آن کپی کنید:

module.exports = {
    firstName: 'James',
    lastName: 'Bond'
}

فصل ۸ – مثال ۴ (فایل data.js)

برای فراخوانی این ماژول می توانید در فایل app.js کد زیر را استفاده کنید:

var person = require('./data.js');
console.log(person.firstName + ' ' + person.lastName);

فصل ۸ – مثال ۴ (فایل app.js)

مثال بالا را با استفاده از node app.js در ترمینال اجرا کنید.

معرفی فانکشن به عنوان ماژول (خروجی گرفتن از Function)

به روش زیر شما قادر هستید تا یک فانکشن را به عنوان یک ماژول export کنید. پیشنهاد می شود فایلی به نام Log.js ساخته و کد زیر را درون آن کپی کنید:

module.exports = function (msg) { 
    console.log(msg);
};

فصل ۸ – مثال ۵ (فایل Log.js)

اکنون می توانید با کد زیر ماژول را درون فایل app.js فراخوانی کنید:

var msg = require('./Log.js');

msg('Hello World');

فصل ۸ – مثال ۵ (فایل app.js)

در مثال بالا متغیر msg به یک عبارت عملیاتی یا همان Function Expression تبدیل خواهد شد. پس شما می توانید با استفاده از پرانتز بعد از نام متغیر، فانکشن را اجرا کنید.

مثال بالا را با استفاده از node app.js در ترمینال اجرا کنید.

معرفی فانکشن به عنوان یک کلاس

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

مثال زیر نشان می دهد که شما چگونه می توانید یک فانکشن را مانند یک کلاس export کنید. این محتویات را درون فایل Person.js کپی کنید:

module.exports = function (firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.fullName = function () { 
        return this.firstName + ' ' + this.lastName;
    }
}

فصل ۸ – مثال ۶ (فایل Person.js)

ماژول ساخته شده بالا را می توان به روش زیر در فایل app.js مورد استفاده قرار داد:

var person = require('./Person.js');

var person1 = new person('James', 'Bond');

console.log(person1.fullName());

فصل ۸ – مثال ۶ (فایل app.js)

مثال بالا را با استفاده از node app.js در ترمینال اجرا کنید تا نتیجه James Bond را همان جا مشاهده کنید.

بارگذاری ماژول ها از پوشه های دیگر

برای بارگذاری ماژول ها، در هر پوشه ای که باشند، در فانکشن require() فقط کافی است تا از full path یا همان آدرس کامل فایل استفاده کنید.

به عنوان مثال اگر فایلی که در آن از فانکشن require() استفاده کرده اید ماژولی که در فولدر utility قرار داده شده باشد را فراخوانی می کند، به این صورت عمل کنید:

var log = require('./utility/Log.js');

فصل ۸ – مثال ۷ (فایل app.js)

در مثال بالا نقطه . مشخص می کند که فولدر utility کنار همین فایلی که در حال اجرای require هست، وجود دارد.

بارگذاری ماژول ها فقط با نام پوشه ای که درون آن قرار دارند

Node.js به شما اجازه می دهد تا فقط با اشاره به نام فولدری که ماژول درون آن قرار دارد، ماژول را فراخوانی کنید. البته مراحل کمی متفاوت است.

مانند مثال زیر که شبیه مورد بالا عمل می کند:

var log = require('./utility');

فصل ۸ – مثال ۸ (فایل app.js)

این مرحله اول کار بود. هنگامی که از نام پوشه استفاده می کنید، Node.js بنا را بر این می گذارد که درون این پوشه یک پکیج وجود دارد. برای اینکه شما Node.js را برای درک بهتر این پکیج راهنمایی کنید، باید فایلی به نام package.json را درون پوشه utility قرار دهید. با محتویات زیر:

{
    "name" : "log",
    "main" : "./Log.js"
}

فصل ۸ – مثال ۸ (فایل package.json)

درواقع این کلمه کلیدی “main” مشخص می کند که فایل اصلی که پکیج ما به آن اشاره دارد کدام فایل است و همچنین نام پکیج را کلمه کلیدی “name” مشخص می کند.

اگر فایل package.json وجود نداشته باشد، Node.js به صورت اتوماتیک فایل index.js را به عنوان فایل ماژول در نظر می گیرد.

منبع: نتران

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

Node.js به برنامه نویسان اجازه می دهد تا رویداد های دلخواه خود را ایجاد کنند و هر بار که خواستند آنها را به اجرا درآورند. ماژول events حاوی کلاس EventEmitter است که می‌تواند رویداد ها را ایجاد کرده و آنها را مدیریت کند. فصل سیزدهم آموزش نود.جی اس نتران، به نحوه استفاده از ماژول events برای به اجرا درآوردن یک رویداد اختصاص دارد.

مثال زیر نشان می‌دهد که شما چگونه می‌توانید از کلاس EventEmitter برای ساخت یک رویداد دلخواه استفاده کنید:

// get the reference of EventEmitter class of events module
var events = require('events');

//create an object of EventEmitter class by using above reference
var em = new events.EventEmitter();

//Subscribe for FirstEvent
em.on('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});

// Raising FirstEvent
em.emit('FirstEvent', 'This is my first Node.js event emitter example.');

 

در مثال بالا ما ابتدا این ماژول events را ایمپورت کرده و سپس یک شی از کلاس EventEmitter ایجاد می کنیم.

سپس با استفاده از متود on() یک فانکشن مدیریت کننده برای رویداد مورد نظر تعریف می کنیم.

فانکشن on() نام رویداد را به عنوان پارامتر اول و فانکشن مدیریت در صورت رخداد رویداد را به عنوان پارامتر دوم دریافت می کند.

فانکشن emit() یک رویداد را اجرا می کند. در پارامتر اول نام رویداد را باید به این فانکشن بدهید و به عنوان پارامتر دوم می توانید اطلاعات اضافی را به رویداد انتقال دهید.

همچنین شما می توانید با استفاده از متود addListener() در صورت ایجاد رخداد مورد نظر یک فانکشن را اجرا کنید. مانند مثال زیر:

var emitter = require('events').EventEmitter;

var em = new emitter();

//Subscribe FirstEvent
em.addListener('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});

//Subscribe SecondEvent
em.on('SecondEvent', function (data) {
    console.log('First subscriber: ' + data);
});

// Raising FirstEvent
em.emit('FirstEvent', 'This is my first Node.js event emitter example.');

// Raising SecondEvent
em.emit('SecondEvent', 'This is my second Node.js event emitter example.');

متود های مهم کلاس EventEmitter

emitter.addListener(event, listener)

این متود یک listener برای یک رویداد خاص به آخر آرایه listener ها اضافه می کند. توجه کنید که بررسی اینکه آیا این listener از قبل وجود دارد یا نه انجام نمی شود.

emitter.on(event, listener)

این متود یک listener برای یک رویداد خاص به آخر آرایه listener ها اضافه می کند. توجه کنید که بررسی اینکه آیا این listener از قبل وجود دارد یا نه انجام نمی شود. از این متود به جای متود addListener می توان استفاده کرد.

emitter.once(event, listener)

این متود فقط برای یک بار، یک رویداد را به اجرا در می آورد.

emitter.removeListener(event, listener)

یک listener را برا یک رویداد خاص حذف می کند.

emitter.removeAllListeners([event])

تمام listener ها را برای یک رویداد خاص حذف می کند.

emitter.setMaxListeners(n)

به طور پیشفرض EventEmitter ها بعد از اضافه کردن ۱۰ عدد listener پیغام هشدار چاپ می کنند.

emitter.getMaxListeners()

مقدار نهایی تعداد listener های ممکن برای یک eventEmiter را باز می گرداند. چه با emitter.setMaxListeners(n) ست شده باشد، چه به صورت پیشفرض

emitter.listeners(event)

یک کپی از آرایه listener ها باز می گرداند.

emitter.emit(event[, arg1][, arg2][, …])

یک رویداد خاص را به اجرا در می آورد.

emitter.listenerCount(type)

تعداد listener هایی که به این نوع رویداد واکنش نشان می دهند را از می گرداند.

روش های متداول استفاده از EventEmitter ها

دو روش متداول برای استفاده از EventEmitter ها در Node.js وجود دارد:

  • بازگرداندن EventEmitter در یک فانکشن
  • توسعه دادن کلاس EventEmitter

بازگرداندن EventEmitter در یک فانکشن

فانکشن سازنده آبجکتی از کلاس EventEmitter را باز می گرداند که برای مدیریت رویداد ها استفاده شده است.

این آبجکت EventEmitter را می توان برای مشترک شدن در رویداد ها استفاده کرد. (یعنی هنگامی که رویداد رخ داد، فانکشنی اجرا شود)

به عنوان مثال به کد زیر توجه کنید:

var emitter = require('events').EventEmitter;

function LoopProcessor(num) {
    var e = new emitter();
    
    setTimeout(function () {
        
        for (var i = 1; i <= num; i++) {
            e.emit('BeforeProcess', i);
            
            console.log('Processing number:' + i);
            
            e.emit('AfterProcess', i);
        }
    }
    , 2000)
    
    return e;
}
var lp = LoopProcessor(3);

lp.on('BeforeProcess', function (data) {
    console.log('About to start the process for ' + data);
});

lp.on('AfterProcess', function (data) {
    console.log('Completed processing ' + data);
});

فصل ۱۳ - مثال ۳

پاسخ اجرای کد بالا چنین خواهد بود:

About to start the process for 1 
Processing number:1
Completed processing 1
About to start the process for 2
Processing number:2
Completed processing 2
About to start the process for 3
Processing number:3
Completed processing 3

در فانکشن LoopProcessor() ابتدا ما یک شی از کلاس EventEmitter ایجاد کرده ایم رویدادهای 'BeforeProcess' و 'AfterProcess' را emit کرده ایم. (emit کردن یعنی اجرا یا انتشار یک رویداد)

در نهایت در این فانکشن با Object ساخته شده از کلاس EventEmitter را باز می گردانیم.

پس ما قادر هستیم با کمک متغیر lp که به فانکشن LoopProcessor() اشاره دارد و اکنون آبجکتی از کلاس EventEmitter است در رویدادها مشترک شویم. اشتراک در رویدادها به کمک فانکشن on() انجام می شود.

به جای فانکشن on() از فانکشن addListener() نیز می توان استفاده کرد.

توسعه دادن کلاس EventEmitter

در این روش مدیریت رویدادها باید در یک فانکشن سازنده کلاس EventEmitter را توسعه دهید و رویدادها را در آن مدیریت کنید.

به مثال زیر توجه کنید:

var emitter = require('events').EventEmitter;

var util = require('util');

function LoopProcessor(num) {
    var me = this;

    setTimeout(function () {
        
        for (var i = 1; i <= num; i++) {
            me.emit('BeforeProcess', i);
            
            console.log('Processing number:' + i);
            
            me.emit('AfterProcess', i);
        }
    }
    , 2000)
        
    return this; 
}

util.inherits(LoopProcessor, emitter)

var lp = new LoopProcessor(3);

lp.on('BeforeProcess', function (data) {
    console.log('About to start the process for ' + data);
});

lp.on('AfterProcess', function (data) {
    console.log('Completed processing ' + data);
});

پاسخ اجرای کد بالا چنین خواهد بود:

About to start the process for 1 
Processing number:1
Completed processing 1
About to start the process for 2
Processing number:2
Completed processing 2
About to start the process for 3
Processing number:3
Completed processing 3 

در مثال بالا ما فانکشن LoopProcessor را با کلاس EventEmitter به وسیله متود util.inherits() گسترش داده ایم. پس this در مثال بالا به کلاس EventEmitter اشاره دارد.

 

منبع : نتران netrun.ir