متخصصین علوم رایانه کشور

Learning MEAN Framework
متخصصین علوم رایانه کشور

۴ مطلب در آذر ۱۳۹۴ ثبت شده است

۲۴
آذر

نسخه: ۱.6

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


محیط برنامه‌نویسی: Visual Studio Code - نشانی: https://code.visualstudio.com

- محیط برنامه‌نویسی به صورت آنلاین: Cloud 9 IDE - نشانی:‌https://c9.io

Node.js - نشانی: https://nodejs.org/en

بانک اطلاعاتی: MongoDB - نشانی:‌ https://www.mongodb.org - https://www.mongodb.com

- لینک مستقیم به قسمت دانلود: https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl

سایتی که ۵۰۰ مگابایت فضای رایگان، برای هاست کردن بانک‌های اطلاعاتی MongoDB به شما تخصیص می‌دهد: MongoLab - نشانی: https://mongolab.com

ابزاری که مانند SQL Server Management Studio عمل کرده و برای بانک‌های اطلاعاتی MongoDB مورد استفاده قرار می‌گیرد: RoboMongo - نشانی: http://robomongo.org

مدیریت سورس‌کدها: Git (گیت) - نشانی: http://git-scm.com

بهترین ابزار Visual، برای استفاده از Git (گیت): SourceTree - نشانی: https://www.sourcetreeapp.com

بهترین هاست، برای درج سورس‌کدها به صورت Public (عمومی): GitHub - نشانی: https://github.com

بهترین هاست، برای درج سورس‌کدها به صورت Private (خصوصی): VisualStudio - نشانی:‌ https://www.visualstudio.com

ابزاری برای Google Chrome در جهت ارسال داده به سایت: PostMan - نشانی: http://www.getpostman.com

ابزاری برای رصد کردن ترافیک و Packet های شبکه: Fiddler - نشانی: http://fiddler2.com


پکیج‌ها و ماژول‌های مهم و کاربردی که معمولا در محیط Node.js به آنها نیاز داریم:


پکیج‌هایی که توصیه می‌شود، به صورت Global نصب شوند:

TSD
https://www.npmjs.com/package/tsd
http://definitelytyped.org/tsd
https://github.com/DefinitelyTyped/DefinitelyTyped

Express Generator
https://www.npmjs.com/package/express-generator
http://expressjs.com/en/starter/generator.html

Nodemon
https://www.npmjs.com/package/nodemon
http://nodemon.io

Yeoman
https://www.npmjs.com/package/yo
http://yeoman.io

Bower
https://www.npmjs.com/package/bower
http://bower.io

Grunt
https://www.npmjs.com/package/grunt-cli
http://gruntjs.com

Angular Generator
https://www.npmjs.com/package/generator-angular

Karma Generator
https://www.npmjs.com/package/generator-karma

پکیج‌هایی که توصیه می‌شود، به صورت Local نصب شوند:

Express.js
https://www.npmjs.com/package/express
http://expressjs.com/en/index.html

Underscore.js
https://www.npmjs.com/package/underscore
http://underscorejs.org

Colors
https://www.npmjs.com/package/colors

Body Parser
https://www.npmjs.com/package/body-parser

Jade
https://www.npmjs.com/package/jade
http://jade-lang.com

Socket IO
https://www.npmjs.com/package/socket.io
http://socket.io

MongoDB
https://www.npmjs.com/package/mongodb

Mongoose
https://www.npmjs.com/package/mongoose
http://mongoosejs.com

Mocha
https://www.npmjs.com/package/mocha

Morgan
https://www.npmjs.com/package/morgan

Cookie Parser
https://www.npmjs.com/package/cookie-parser

Passport
https://www.npmjs.com/package/passport
http://passportjs.org

Node Mailer
https://www.npmjs.com/package/nodemailer

Bcrypt
https://www.npmjs.com/package/bcrypt
https://www.npmjs.com/package/bcrypt-nodejs

Json Web Token
https://www.npmjs.com/package/jsonwebtoken

برای اطلاع از Global NPM Package هایی که نسخه جدیدی برای آنها وجود دارد، از دستور ذیل استفاده می‌کنیم:

npm outdated -g --depth=0

برای به روز رسانی تمامی NPM Package هایی که به صورت Global نصب شده‌اند، از دستور ذیل استفاده می‌کنیم:

npm update -g

برای اطلاع از Local NPM Package هایی که نسخه جدیدی برای آنها وجود دارد، از دستور ذیل استفاده می‌کنیم:

npm outdated

برای به روز رسانی تمامی NPM Package هایی که به صورت Local نصب شده‌اند، از دستور ذیل استفاده می‌کنیم:

npm update

دو نکته بسیار مهم:

۱. قبل از اقدام به نصب و یا به روز رسانی NPM Package ها، حتما به سایت Node مراجعه کرده و آخرین نسخه آنرا دریافت و نصب نمایید.

۲. با توجه به اینکه برنامه NPM برای نصب NPM Package ها، به صورت پیش‌فرض از پروتکل https استفاده می‌کند، و به لطف مخابرات کشور عزیزمان، که همیشه ما را مورد لطف و عنایت خود داشته و دارد! نصب اکثر پکیج‌ها با خطا مواجه می‌شود. لذا با استفاده از دستور ذیل، شما به برنامه NPM‌ اعلام می‌کنید، که به جای استفاده از پروتکل https، از پروتکل http برای نصب استفاده نماید:

npm config -g set registry http://registry.npmjs.org/

انشاءالله در رابطه با هر یک از Package های فوق، توضیحات مبسوطی خواهم داد.

دوستان خوبم، لطفا در صورتی که لینکی به درستی کار نمی‌کرد، به من اطلاع دهید...

  • داریوش تصدیقی
۲۲
آذر
موضوع:‌ آموزش Callback Pattern - Creating Asynchronous Function
ویرایش:‌ ۱.۱

اجازه دهید مجددا بخشی از سورس‌کدی که در قسمت سوم آموزشی،‌ نوشته‌ایم را بررسی نماییم:

server.listen(3000);
console.log('Web server is listening...');

این کد، کد مناسبی نمی‌باشد! ولی علت چیست؟ واقعیت آن است که دستورات JavaScript چه در سمت Client و چه در سمت Server، به ترتیب اجرا می‌شوند و بسیاری از دستورات پیش‌فرض، مانند دستور listen، به صورت Async اجرا می‌شوند. این بدان معنی است که پس از فرآخوانی دستوری مانند server.listen، سیستم در این خط دچار وقفه نشده و به سرعت سراغ دستور بعدی می‌رود. حال فرض کنید که اجرای دستور listen، به هر دلیلی، پنج ثانیه به طول بیانجامد. در این صورت شما پیام Web server is listening را پنج ثانیه قبل از راه‌اندازی واقعی و در محیط Console خواهید دید! که این اصلا درست نمی‌باشد. از آن بدتر! زمانی است که راه‌اندازی Server به مشکل برخورد کرده و اصلا راه اندازی نشود، در این صورت باز هم شما پیام مذکور را خواهید دید که سرور به درستی راه‌اندازی شده و منتظر درخواست از طرف Client می‌باشد!
با توجه به نکات فوق، به این نتیجه می‌رسیم که باید دستورات فوق را به گونه دیگری بنویسیم. حال به دستورات ذیل توجه نمایید:

server.listen(3000, function(error) {

    if(error != null) {
        console.log('Web server can't listen! - ' + error);
        return;
    }

    console.log('Web server is listening...');
});

کد فوق، یک کد هوشمندانه و مناسب می‌باشد! به محض اینکه سیستم، به دستور server.listen می‌رسد، متوجه می‌شود که باید این دستور را اجرا کند و اقدام به اجرای آن می‌کند. ولی معطل اجرای آن نمی‌شود! و به سرعت، به سراغ دستورات بعد از server.listen خواهد رفت. ولی هرگاه عملیات مربوط به server.listen (چه با خطا و یا بدون خطا) خاتمه یابد، وارد تابع درونی server.listen می‌شود. در صورتی که کار با موفقیت صورت نگرفته باشد، شیء error مخالف null بوده، که در این صورت، پیام خطا در محیط کنسول نمایش داده می‌شود و در صورتی که عملیات با موفقیت صورت گرفته باشد، پیام Web server is listening، در محیط کنسول نمایش داده خواهد شد.
به تابع درونی server.listen، اصطلاحا Callback Function می‌گویند، و به خود تابع listen، یک تابع Asynchronous اطلاق می‌شود و ما به کرات از اینگونه توابع، در هنگام برنامه‌نویسی در محیط‌های Client و یا Server برخورد خواهیم کرد.
ولی چیزی که از مطلب فوق اهمیت بیشتری دارد، آن است که یاد بگیریم، چگونه تفکر و یا الگوی Callback را پیاده‌سازی نماییم، و چگونه اقدام به نوشتن یک توابع Asynchronous نماییم. فرض کنید که ما یک یا چند دستور سنگین داریم که اجرای آنها زمان زیادی را به خود اختصاص می‌دهند. به عنوان مثال فرض کنید، می‌خواهیم یک Data Conversion سنگین انجام دهیم، که به طور تقریبی، ۶۰ ثانیه به طول می‌انجامد. توجه داشته باشید که در محیط‌های Client‌ و یا Server، اجرای دستورات JavaScript، فقط با یک Thread انجام می‌شوند. لذا اگر یکی از کاربران سیستم، باعث شود که اجرای برنامه، به دستورات سنگینی برخورد نماید، متاسفانه تمام کاربران سایت، به مدت ۶۰ ثانیه معطل اجرای دستورات مختص به خود خواهند شد، و این یک فاجعه است! لذا می‌خواهیم الگویی را یاد بگیریم که مناسب اینگونه شرایط است.
برای این منظور، ابتدا دستوراتی که اجرای آنها زمان زیادی را به خود اختصاص می‌دهند را در داخل یک تابع جداگانه‌ای می‌نویسیم. در مثال ذیل، فرض بر این است که تابع مذکور، دارای پارامتر ورودی خاصی نمی‌باشد. در این حالت فقط یک پارامتر ورودی به نام callback، برای تابع مذکور، تعریف می‌کنیم. دقت داشته باشید، در صورتی که بخواهیم برای تابع مذکور، به عنوان مثال، دو پارامتر a و b ارسال نماییم، باید تعداد پارامترهای تابع مذکور را برابر سه پارامتر تعریف نماییم و باید پارامتر آخر آن callback باشد.
پس از نوشتن تابع مذکور، در درون آن از دستور setTimeout استفاده می‌کنیم. دقت داشته باشید که این تابع، کلید Callback Pattern می‌باشد. در شرایط عادی،‌ از این تابع، زمانی استفاده می‌کنیم که بخواهیم دستور یا دستوراتی را پس از گذشت چند میلی ثانیه، اجرا نماییم. ولی در حال حاضر، نیت و هدف دیگری داریم! با استفاده از این تابع، می‌توانیم الگوی Callback را پیاده‌سازی نماییم. لذا در داخل تابع مذکور، تابع setTimeout را نوشته و زمان اجرای آنرا، برابر صفر در نظر می‌گیریم.
function calculateSalary(callback) {
setTimeout(function () {

// Do some process(es) for calculating salary.
for (var index = 1; index <= 1000000000; index++) {
}

callback();
}, 0);
}
در دستورات فوق، فرض بر آن است که دستور for، همان دستوری است که اجرای آن زمان زیادی را به خود اختصاص می‌دهد.
حال زمانی که می‌خواهیم دستورات سنگین و پر هزینه از نظر زمانی مذکور را اجرا نماییم، به صورت ذیل عمل می‌کنیم:

calculateSalary(function () {
console.log('Salary Calculation Done!');
});

حال نمونه دیگری را با هم بررسی می‌کنیم. نمونه‌ای که در آن، تابع مربوطه، به عنوان مثال، دارای دو پارامتر ورودی a‌ و b‌ می‌باشد.

function calculateSalary(a, b, callback) {
setTimeout(function () {

// Do some process(es) for calculating salary.
for (var index = 1; index <= 1000000 * a * b; index++) {
}

callback();
}, 0);
}

calculateSalary(5, 10, function () {
console.log('Salary Calculation Done!');
});


در دو نمونه فوق، دو مشکل اساسی داریم:
۱. در صورتی که اجرای تابع، به مشکلی برخورد کند، راه حل مناسبی پیشنهاد نشده است!
۲. در صورتی که نیاز داشته باشیم که تابع مذکور خروجی در اختیار ما قرار دهد نیز راه حل مناسبی پیشنهاد نشده است!
حال اجازه دهید که بهترین و هوشمندانه‌ترین راه حل را با هم و به کمک مثال ذیل پی می‌گیریم. در مثال ذیل، اولا برای تابع خود، پارامترهای ورودی داریم به نام‌های a و b در نظر گرفته‌ایم، و نیز، در صورت بروز خطا در زمان اجرای تابع مذکور، روش علمی و مناسبی ارایه کرده‌ایم و ثالثا، مقداری را به عنوان نتیجه و یا خروجی تابع ایجاد کرده و برمی‌گردانیم:

function division(a, b, callback) {
setTimeout(function () {

// Do some process(es) for calculating salary.
for (var index = 1; index <= 1000000000; index++) {
}

if (b == 0) {
var error =
new Error('Division by zero!');

callback(error, null);
}
else {
var result = a / b;

callback(null, result);
}
}, 0);
}

division(10, 2, function (error, result) {

if (error != null) {
console.log(error);
}
else {
console.log('Result: ' + result);
}
});

division(5, 0, function (error, result) {

if (error != null) {
console.log(error.message);
}
else {
console.log('Result: ' + result);
}
});

console.log('This message will be shown Immediately!');

  • داریوش تصدیقی
۱۰
آذر

درسی که امروز برای شما دوستان در نظر گرفته‌ایم، شاید از نظر زمانی، کمی زود باشد! ولی تجربه نشان داده است، در کلاس‌های آموزشی، به دلیل هیجان‌انگیز بودن موضوع، ارایه این مطلب آموزشی، بسیار مفید و جذاب بوده، و انگیزه نوآموزان را برای یادگیری Node.js دو چندان می‌کند.

در این درس می‌خواهیم با استفاده از محیط Visual Studio Code و با استفاده از Node.js، اقدام به راه‌اندازی یک Web Server ساده نماییم. برای این منظور، ابتدا وارد محیط Windows Command Prompt شده و مجددا در پوشه‌ای که برای این سری از آموزش‌ها در نظر گرفته‌ایم، پوشه‌ای به نام Learn_1030 ایجاد کرده، وارد آن شده، و از طریق دستور ذیل وارد محیط Visual Studio Code می‌شویم:

?\Learn_1030>Code .

پس از ورود به محیط Visual Studio Code، از پنجره EXPLORE، گزینه New File را انتخاب نموده و فایلی به نام app.js ایجاد می‌نماییم. حال دستورات ذیل را در داخل این فایل (app.js) می‌نویسیم. نگران دستورات ذیل نباشید! یکایک دستورات ذیل و فلسفه استفاده از هر کدام را در این درس و در درس‌های آتی فرا خواهید گرفت:

var http = require('http');

var server = http.createServer(function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.write('<b>Hello, World!</b>');
response.end();
});

server.listen(3000);
console.log('Web server is listening...');

قبل از آنکه دستورات فوق را یک به یک توضیح دهیم، ابتدا برنامه را اجرا نموده تا پیام Web server is listening، در پنجره Console محیط Visual Studio Code ظاهر گردد. حال از طریق یک مرورگر (Browser) مانند Google Chrome، وارد نشانی ذیل می‌شویم:

http://localhost:3000

شاید باورش کمی سخت باشد! ولی ما با همین چند دستور ساده فوق، نه تنها یک سایت ایجاد کرده‌ایم، بلکه یک Web Server مانند IIS و یا Apache Server ایجاد کرده‌ایم! به همین دلیل، شاید این جمله که Node.js صرفا یک Web Server‌ است، کمی بی انصافی باشد! در واقع Node.js یک Server است! که می‌توان در درون آن، به راحتی یک یا چند Web Server و یا سرویس‌های دیگر را ایجاد و راه‌اندازی نمود...

و اما توضیح دستورات فوق...

در اولین خط دستورات فوق، شما با دستور require مواجه می‌شوید. این دستور که بسیار شبیه دستور Add References در محیط کلاسیک Visual Studio می‌باشد، ما را قادر می‌سازد تا از Module دیگری در داخل Module جاری خود استفاده نماییم.  

در Node.js، هر پروژه‌ای که ایجاد می‌کنیم، اصطلاحا یک Module نامیده می‌شود، و در هر Module نیز ممکن است از Module های دیگری استفاده گردد:

۱. Module هایی که خودمان در داخل Module‌ یا پروژه اصلی ایجاد می‌کنیم. (در درس‌های بعد، طریقه ایجاد انواع Module ها در داخل پروژه، آموزش داده خواهند شد)

۲. Module هایی که متعلق به خود Node.js می‌باشند. (مانند http)

۳. Module هایی که دیگران (اشخاص حقیقی و حقوقی) آنها را ایجاد کرده‌اند، در داخل سایت http://www.npmjs.com‌ قرار داده‌اند، و ما از آنها در داخل Module های خود استفاده می‌کنیم. (در درس‌های آتی، ابتدا به معرفی Module های معروفی که برای ایجاد یک پروژه حرفه‌ای به آنها نیاز داریم، خواهیم پرداخت، و سپس طریقه دانلود و درج آنها به پروژه را به تفصیل توضیح خواهیم داد)

یکی از Module های اساسی در Node.js، ماژول http می‌باشد، که با استفاده از آن می‌توانیم به سادگی یک Web Server‌ ایجاد نماییم.

در خط بعد، و با استفاده از دستور http.createServer، یک Web Server ایجاد می‌کنیم، و به Web Server می‌فهمانیم، در صورتی که درخواستی به سمتش ارسال گردید، باید تابع روبروی آنر اجرا نماید. دقت داشته باشید که با استفاده از دستور مذکور، صرفا Web Server ایجاد شده ولی راه‌اندازی نمی‌گردد! بلکه با استفاده از دستور (3000)server.listen، وب سرور راه‌اندازی شده و گوش به زنگ درخواست‌های آتی می‌باشد.

در تابع درونی createServer، دو پارامتر ورودی request و response وجود دارد. با استفاده از پارامتر request می‌توانیم شناسایی کنیم که چه نوع درخواستی از Web Server صورت گرفته استِ، و با استفاده از پارامتر response می‌توانیم هر آنچه تمایل داریم (اعم از فایل، صفحه، متن، json و غیره...) به سمت درخواست کننده (Client) ارسال نماییم.

در داخل تابع درونی createServer، ابتدا عبارتی را به سمت درخواست کننده (مثلا مرورگر) ارسال می‌کنیم، که در داخل آن، مشخص شده است که همه چیز در سمت Server، مرتب بوده و هیچ مشکلی پیش نیامده است. عدد ۲۰۰ بیانگر این موضوع می‌باشد. مقدار text/plain، به عنوان Content Type‌ یا اصطلاحا Mime Type، به درخواست کننده می‌فهماند، هر آنچه از طریق Server به سمتش ارسال می‌گردد، باید به صورت یک متن عادی نمایش دهد! پس به همین دلیل، وقتی ما از طریق مرورگر، نشانی http://localhost:3000 را هدف قرار دادیم، عبارت !Hello, World نه تنها به صورت پررنگ نمایش داده نشد! بلکه دقیقا تگ‌های باز و بسته Bold نیز قابل رویت بود. دقت داشته باشید، اگر به جای دستور مذکور، از دستور ذیل استفاده می‌کردیم، نه تنها عبارت !Hello, World به صورت پررنگ دیده می‌شد، بلکه در هنگام نمایش، تگی نیز مشاهده نخواهد شد:

response.writeHead(200, { 'Content-Type': 'text/html' });

استفاده از دستور response.end، به مرورگر می‌فهماند، که دیگر داده و اطلاعاتی در جهت ارسال توسط Web Server‌ وجود ندارد. در صورتی که این دستور نوشته نشود، پس از درخواست از Web Server، با استفاده از مرورگر، آیکن Loading در بالای مرورگر، ظاهر شده و متوقف نمی‌گردد!

  • داریوش تصدیقی
۰۳
آذر

برای دانلود Visual Studio Code، ابتدا وارد پایگاه http://code.VisualStudio.com شده و با توجه به سیستم عامل خود، نسخه مناسب را انتخاب، دریافت و نصب نمایید. با توجه به اینکه در این مجموعه، هدف اصلی ما، آموزش MEAN Framework می‌باشد، پس از نصب Visual Studio Code، باید نسبت به دریافت و نصب Node.js نیز اقدام نمایید. دقت کنید که پس از نصب این دو نرم‌افزار، باید یکبار سیستم عامل Windows خود را Restart نمایید.

عنایت داشته باشید که در محیط Visual Studio Code، برخلاف Visual Studio، مفهومی با عنوان Project و Solution وجود ندارد! بلکه تفکر کاملا Folder Based می‌باشد. به همین جهت، در گزینه‌های منوی آن، گزینه‌ای با عنوان Open Folder دارد.

حال اجازه دهید که یکی از تمرین‌های مربوط به "آموزش Node.js - قسمت دوم" را این بار با محیط Visual Studio Code اجرا نماییم. برای این منظور ابتدا پوشه‌ای به نام Learn_003 ایجاد کرده و فایل app.js را از پوشه Learn_002، به داخل آن کپی می‌نماییم.

برای اینکه سورس کد را در محیط Visual Studio Code مشاهده نماییم، می‌توانیم از یکی از روش‌های ذیل استفاده نماییم:

۱. از طریق پنجره Windows Explorer وارد پوشه Learn_003 شده، سپس دکمه سمت راست ماوس را زده تا منویی (Context Menu) ظاهر شود. از منوی ظاهر شده، گزینه Open with Code را انتخاب نمایید.

۲. از طریق برنامه Windows Command Prompt، وارد پوشه Learn_003 شده و دستور ذیل را بنویسید:

?> Code .

۳. وارد برنامه Visual Studio Code شده و از منوی File، گزینه Open Folder‌ را انتخاب کرده و پوشه Learn_003 شده و سپس بر روی دکمه Select Folder، کلیک نمایید.

با انجام یکی از روش‌های فوق، پروژه مربوطه باز شده و آماده اجرا می‌باشد. شما می‌توانید فهرست سورس‌کدهای خود را پنجره EXPLORE مشاهده نمایید.

با زدن دکمه‌های ترکیبی CTRL+SHIFT+D، پنجره مربوط به Debug‌ ظاهر شده و می‌توانید با کلیک بر روی دکمه سبز رنگ Start، و یا زدن دکمه F5، نسبت به اجرای برنامه خود اقدام نمایید.

دقت داشته باشید که صرفا در اولین اجرا، ضمن آنکه برنامه اجرا نمی‌شود! کادر مربوط به Select Debug Environment ظاهر شده و گزینه‌هایی را به شما نمایش می‌دهد. دقت کنید که گزینه Node.js را انتخاب نمایید. با این کار، به طور خودکار، پوشه‌ای به نام vscode. ایجاد شده و در داخل آن فایلی به نام launch.json ایجاد می‌گردد. در داخل فایل launch.json، اطلاعاتی که برنامه Visual Studio Code برای اجرای پروژه شما نیاز دارد، درج می‌گردد.

حال اگر مجددا نسبت به اجرای برنامه اقدام نمایید، برنامه اجرا شده و نتیجه آن را در پنجره Debug Console خواهید دید.

  • داریوش تصدیقی