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

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

با سلام و عرض ادب خدمت تمامی دوستان و سروران گرامی

من داریوش تصدیقی هستم و بسیاری از شما عزیزان، نام مرا در رابطه با محیط دات نت (NET.) و زبان برنامه‌نویسی سی شارپ (#C) شنیده‌اید... ولی قریب ۲ سال است، ضمن کار و آموزش در حوزه دات نت و سی شارپ، با MEAN Framework، آشنا شده‌ام و مرا خیلی به خود جذب کرده است... حروف اولیه MEAN، عبارتند از MongoDB, Express.js, Angular.js, Node.js که البته در طی این دو سال، دوره‌های موفق و زیادی در خصوص Angular.js برگزار کرده‌ام و پروژه‌های زیادی نوشته‌ام... ولی در رابطه با بقیه موارد، به این فکر افتادم تا برای آشنایی بیشتر شما عزیزان، همه این موارد را در قالب یک وب‌لاگ ارایه دهم. امیدوارم که مطالب این وب‌لاگ، مورد توجه و عنایت شما عزیزان قرار گرفته و در این مسیر با من همراه باشید...

این مجموعه، اگر نگوییم که ممکن است در آینده‌ای نه چندان دور، اکثر شرکت‌ها را به سمت خود جذب خواهد کرد، ولی بدون اغراق می‌توان ادعا کرد، که هر برنامه‌نویسی را مسحور خود خواهد ساخت...

برای اطلاع‌رسانی به شما عزیزان، در خصوص درج و ویرایش مطالب و نیز اعلام برگزاری دوره‌های آموزشی در این خصوص، کانالی را در تلگرام ایجاد نمودم که می‌توانید در آن عضو شوید:

https://Telegram.me/IranianExperts

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

با سپاس از وقتی که برای مطالعه این مطالب صرف می‌کنید...

با تجدید احترام
داریوش تصدیقی

0098-912-108-7461 - DariushT@GMail.com

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

با سلام و احترام خدمت دوستان خوب و صمیمی

قبل از هر چیز، لازم به ذکر است که هر چند که فریم‌ورک انگیولار از نسخه ۲ به بعد نسبت به نسخه ۱ تفاوت‌های اساسی کرده است، ولی جالب اینجاست که نام این فریم‌ورک نیز تغییر کوچکی داشته که لازم می‌دانم قبل شروع بحث آنرا به شما عزیزان خاطرنشان کنم. تا قبل از نسخه ۲، نام این فریم‌ورک AngularJS بود که بعد از آمدن نسخه ۲ و بعد از آن، نام این فریم‌ورک به Angular تغییر یافت. در ضمن بد نیست دوستان در جریان باشند که بعد از نسخه ۲ مستقیما نسخه ۴ منتشر گردید و نسخه ۳ وجود ندارد!

برای راه‌اندازی Angular و یا AngularJS در محیط Visual Studio 2015 و Visual Studio 2017 و در بسترهای ASP.NET MVC و ASP.NET MVC Core روش‌های زیادی تاکنون اعلام شده است. ولی امروز می‌خواهم یکی از راحت‌ترین و مطمین‌ترین روش‌ها را به شما عزیزان آموزش دهم.

۱. ابتدا Visual Studio 2017 را نصب نمایید.

۲. با استفاده از دستور ذیل در محیط Command Prompt کلیه Template های مناسب ASP.NET Core را نصب می‌کنیم.

?> dotnet new --install Microsoft.AspNetCore.SpaTemplates::*

۳. حال پوشه‌ای که می‌خواهید پروژه جدید خودتان را در آن بسازید (MY_MVC_CORE)، ایجاد کرده و وارد آن شده و در محیط Command Prompt دستور ذیل را بنویسید:

?\MY_MVC_CORE> dotnet new angular

۴. با دستور فوق، تعدادی فایل و پوشه ایجاد می‌گردد.

۵. حال در محیط Windows Explorer وارد پوشه مذکور شده و بر روی فایل MY_MVC_CORE.csproj که ایجاد شده است، Double Click نمایید.

۶. پس از ورود به محیط Visual Studio به طور اتوماتیک تمامی Module هایی که در داخل فایل package.json نوشته شده است به صورت اتوماتیک Download شده و در داخل پوشه‌ای به نام node_modules قرار می‌گیرند.

۷. ممکن است که نسخه درج شده از Angular‌ در فایل package.json قدیمی‌تر از آخرین نسخه باشد. به عنوان مثال، در این لحظه که اینجانب در حال نوشتن این مقاله می‌باشم، در داخل فایل package.json برای تمام خطوط مربوط به Angular نسخه ۴.۱.۲ درج گردیده، در حالی که در سایت Angular.io آخرین نسخه ۴.۳.۳ اعلام شده است. برای حل این مشکل، ابتدا وارد سایت NPM رفته و گزینه @Angular/Core را جستجو کرده تا آخرین نسخه را بدست آورید و سپس در داخل فایل package.json تمام اعداد ۴.۱.۲ مربوط به Module های Angular را به آن عدد تغییر داده و سپس با Mouse بر روی فایل package.json رفته و کلید سمت راست ماوس را زده و گزینه Restore Packages را انتخاب می‌کنیم، تا مجددا از طریق اینترنت نسخه‌های جدیدتر را Download کرده و Replace نماید.

  • داریوش تصدیقی
۱۹
اسفند

ورود به سایت Node.js و دانلود و نصب آخرین نسخه آن و معرفی سایت NPM.

ورود به سایت Visual Studio Code و دانلود و نصب آخرین نسخه آن.

ورود به سایت Type Script Land.

ویندوز را Restart می‌کنیم.

وارد محیط Command Prompt شده و دستورات ذیل را می‌نویسیم:

?>node --version

?>npm --version

?>code --version

?>npm install -g typescript

--> C:\Users\Dariush_Tasdighi\AppData\Roaming\npm

?>tsc --version

از طریق Command Prompt یک پوشه خالی ایجاد کرده، وارد آن شده و دستور ذیل را وارد می‌کنیم:

Some New Folder>code .

از آنجایی که می‌خواهیم پروژه ما در حالت Explicit Project بوده (سعی می‌کنیم که از حالت File Scope اجتناب کنیم) در ریشه پروژه فایلی به نام tsconfig.json ایجاد کرده و در داخل آن دستورات ذیل را می‌نویسیم:

{

    "compilerOptions": {

        "target": "es5",

        "module": "commonjs",

        "sourceMap": true

    }

}

Transpiling TypeScript into JavaScript

حال یک فایل به نام HelloWorld.ts با سورس کد ذیل در ریشه پروژه ایجاد می‌کنیم:

class Startup {

    public static main(): number {

        console.log('Hello World');

        return 0;

    }

}


Startup.main();

حال در داخل محیط Visual Studio Code یا از دکمه F1 و یا از دکمه‌های ترکیبی CTRL + Shift + P استفاده می‌کنیم تا ناحیه Command Palette ظاهر شود. در داخل این ناحیه Configure Task Runner را تایپ کرده و سپس Enter را می‌زنیم. در پنجره ظاهر شده گزینه TypeScript - tsconfig.json را انتخاب کرده تا فایلی به نام tasks.json در پوشه‌ای به نام vscode. ایجاد گردد:

{

"version": "0.1.0",

"command": "tsc",

"isShellCommand": true,

"args": ["-p", "."],

"showOutput": "silent",

"problemMatcher": "$tsc"

}

از این پس، هرگاه از دکمه‌های ترکیبی CTRL + Shift + B استفاده نماییم، این Task اجرا شده و اجرای آن باعث می‌گردد که تمامی فایل‌های ts به فایل‌های js اصطلاحا Transpiling گردد.

در صورتی که فایل ts دارای خطایی نباشد، دو فایل با پسوند js‌ و map ایجاد شده و ما می‌توانیم به سادگی و از طریق محیط Command Prompt فایل js ایجاد شده را در محیط Node.js اجرا نماییم:

Some New Folder>node HelloWorld.js

دقت کنید که حتی نیازی نیست که وارد محیط Command Prompt شوید! شما می‌توانید از طریق پنجره Terminal نیز اقدام به نوشتن دستور فوق نمایید.

نکته جالب: در صورتی که در داخل فایل tsconfig.json از دستور watch با پارامتر true استفاده نمایید، پس از اجرای Task با استفاده از میامبر CTRL + Shift + B، نه تنها همان لحظه تمامی فایل‌های ts به فایل‌های js و map اصطلاحا Transpiling می‌شوند، بلکه این Task از کار نیافتاده و روی فایل‌های ts شما Observe می‌کند! بدین معنی که هرگاه فایل ts ای را از این به بعد تغییر داده و ذخیره نمایید، همان لحظه عملیات Transpiling اتفاق می‌افتد.

{

    "compilerOptions": {

        "target": "es5",

        "module": "commonjs",

        "sourceMap": true,

        "watch": true

    }

}

  • داریوش تصدیقی
۰۱
اسفند
  • داریوش تصدیقی
۱۵
تیر

شماره سریال یا Activation Code مربوط به برنامه WinZip نسخه ۲۰

Licensed To: KillDozer

Activation Code: YP3Z5-LRWDK-AGCLJ-FGRHX-FP2MY-0GWJE

  • داریوش تصدیقی
۲۸
ارديبهشت

برای اینکه یک پروژه Node.js را روی یک سرور واقعی تست نمایید، ابتدا باید پورت مورد نظر خود را روی سرور باز کرده:


برای باز کردن پورت (Port) روی Windows Server 2012:

Control Panel --> System Security -> Windows Firewall -> Advanced Settings --> Inbound Rules --> New Rule


و سپس در هنگام Listen کردن Server در کد مربوطه، به Node.js اعلام نمایید که فقط با نشانی 127.0.0.1 و یا localhost این سرور Listen نخواهد کرد و روی تمامی IP آدرس‌های Assign شده به سرور، این امکان وجود ندارد:

var http = require('http');

var server = http.createServer(function (request, response) {

    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.write('<b>Hello, World!</b>');

    response.end();

});

server.listen(6969, '0.0.0.0', function (error) {

    if (error) {

        console.log(error);

    }
    else {

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

    }

});


  • داریوش تصدیقی
۲۵
فروردين

با سلام و احترام خدمت دوستان خوب و صمیمی

من در اغلب موارد از برنامه Snagit برای ضبط فیلم‌های آموزشی استفاده می‌کنم. چندی پیش ضبط صدا در این برنامه دچار مشکل جدی شد! به این معنی که پس از ضبط فیلم و صدا، وقتی که فیلم ضبط شده را Play کردم، صدا اصلا قابل فهم نبود و به شدت بد ضبط شده بود... جالب است بدانید، وقتی متوجه شدم که ظاهرا LCD نوت‌بوکم ضربه خورده است، تصور کردم که حتما مشکل سخت‌افزاری در این خصوص رخ داده است! شاید باور نکنید که به همین دلیل، رفتم و یک نوت‌بوک دیگری خریداری کردم... روی نوت‌بوک جدید، Windows 10 نصب کردم و پس از نصب برنامه Snagit و ضبط اولین فیلم آموزشی، در کمال تعجب متوجه شدم که متاسفانه، باز هم ضبط صدا مشکل دارد و اصلا قابل فهم نیست! اینگونه بود که رفتم در گوگل و مشکل را از طریق این موتور جستجو پیگیری کردم... هر چند که خیلی از کاربران دچار این مشکل شده بودند، ولی متاسفانه پاسخ درستی کسی نداده بود... به همین منظور خودم شروع کردم به عملیات سعی و خطا... تا اینکه پاسخ را پیدا کردم...

در Windows 10، و در قسمت تنظیمات Sound Recorder گزینه‌ای اضافه شده است که متاسفانه به صورت پیش‌فرض فعال بوده و برای اکثر برنامه‌هایی که اقدام به ضبط صدا می‌کنند، این مشکل را بوجود آورده است...

برای حل مشکل ضبط صدا در Windows 10 مراحل ذیل را انجام دهید:

۱. از دکمه‌های ترکیبی Windows + Q استفاده کنید، تا پنجره جستجوی برنامه‌ها ظاهر شود.

۲. کلمه Sound را نوشته، و گزینه Sound - Control Panel را انتخاب نمایید.

۳. در پنجره ظاهر شده، Tab مربوط به Recording را انتخاب نمایید.

۴. در Tab مربوطه، بر روی گزینه Internal Microphone کلیک کرده تا دکمه‌های پایین، از حالت غیرفعال خارج شوند.

۵. بر روی دکمه Properties کلیک کنید، تا پنجره Internal Microphone Properties ظاهر شود.

۶. در پنجره اخیر، Tab مربوط به Advanced را انتخاب کرده و گزینه Enable Audio Enhancements را از حالت انتخاب خارج کنید! (غیر فعال کنید)

این گزینه Enable Audio Enhancement، گزینه‌ای است که در Windows 10 اضافه شده و به صورت پیش‌فرض فعال بوده و متاسفانه در اکثر برنامه‌هایی که اقدام به ضبط صدا می‌کنند، اختلال بوجود می‌آورد.

امیدوارم که چنین مشکلاتی برای شما دوستان خوبم پیش نیاید و زندگی و سیستم‌های شما، همیشه سلامت و بی باگ باشند...

  • داریوش تصدیقی
۱۰
فروردين

با سلام و احترام خدمت یکایک دوستان خوب و صمیمی

ضمن عرض تبریک سال نو، در این مطلب می‌خواهم نکاتی را در خصوص نصب و راه‌اندازی برنامه VirtualBox حضور شما عزیزان عرض کنم.

احتمالا بعضی از شما دوستان بعد از نصب VirtualBox با این مشکل مواجه هستید که صرفا می‌توانید سیستم‌های مورد نظر خود را ۳۲ بیتی نصب نمایید! و ظاهرا امکان نصب آنها به صورت ۶۴ بیتی امکان‌پذیر نمی‌باشد.

برای حل این مشکل، ابتدا دکمه‌های ترکیبی Windows Key + Q را از طریق صفحه کلید انتخاب کرده تا پنجره Quick Search‌ ظاهر شود. در پنجره مذکور متن ذیل را نوشته و گزینه یافت شده را انتخاب نمایید:

Turn Windows Features On or Off

در پنجره Windows Features گزینه Hyper-V را به طور کامل از حالت انتخاب خارج نمایید.

حال سیستم را Restart کرده و وارد تنظیمات BIOS دستگاه خود شوید. سپس دو گزینه ذیل را پیدا کرده و آنها را Enabled نمایید.

Intel (R) Virtualization Technology
Intel (R) VT-d Feature

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

دوستان گلم، از آنجایی که تصمیم دارم از این درس به بعد، آموزش Package های مفید و پرکاربرد Node.js را آموزش دهم، تصمیم گرفتم مطلبی آماده کنم که برای شروع هر یک از آموزش‌های آتی الزامی است.

یکی از مهمترین Package های مربوط به Node.js، پکیج Express.js می‌باشد. ولی یادمان باشد که تمامی Package های مربوط به Node.js، به کمک خود Node.js ایجاد شده‌اند! پس تصور اینکه ما می‌توانیم با Express.js کارهایی انجام دهیم که با Node.js امکان‌پذیر نمی‌باشد، تصوری کاملا نادرست می‌باشد. به طور کلی، استفاده از Package هایی مانند Express.js، صرفا کار را برای ما تسهیل می‌کنند و به جای اینکه ما کدهای زیادی نوشته و یا اصطلاحا چرخ را از اول اختراع نماییم، کلاس‌ها و توابعی را در اختیار ما قرار می‌دهند که باعث می‌شوند ما در هنگام کدنویسی و به قول آمریکایی‌ها، Happy باشیم...

بسیار خوب، برای شروع هر پروژه واقعی و یا آموزشی، باید موارد ذیل را به ترتیب انجام دهید:

۱. وارد محیط Windows Command Prompt می‌شویم.

۲. در هر درایو و یا پوشه‌ای که می‌خواهیم، یک پوشه ایجاد کرده و وارد آن می‌شویم.

۳. دستور ذیل را اجرا کرده تا از ما سوالاتی در خصوص پروژه پرسیده شود. در انتهای کار فایلی به نام package.json ایجاد می‌گردد:

?> npm init
name: some_name
version: 1.0.0
description: Learning Something
entry point: app.js
test command:
git repository:
keywords: Learning Something
author: Mr. Dariush Tasdighi
license: ISC
yes

توجه: در قسمت name، باید از حروف کوچک استفاده کرده و حق استفاده از فاصله خالی (Spacebar) را نداریم!

۴. با دستور ذیل، پکیج (ماژول) Express.js را در پوشه جاری نصب می‌کنیم:

?> npm install express --save

توجه: save-- برای این نوشته می‌شود که در داخل فایل package.json، قید گردد که پروژه جاری از Express.js استفاده می‌کند. ضمنا دقت داشته باشید پس از اجرای دستور فوق، در پوشه جاری، پوشه‌ای به نام node_modules ایجاد شده و در داخل آن تمامی ماژول‌های مربوط به Express.js و نیز ماژول‌هایی که Express.js به آنها نیاز دارد، قرار می‌گیرند.

۵. قبل از اینکه وارد محیط Visual Studio Code و یا به طور خلاصه (مخفف) VSCode شویم، برای اینکه در این محیط IntelliSense مناسبی داشته باشیم ابتدا دستور ذیل را اجرا می‌کنیم:

? npm install tsd -g

۶. پس از دستور فوق، دو دستور ذیل را اجرا کرده تا IntelliSense های مربوط به Node و نیز Express دانلود شده و در پوشه‌ای به نام typing قرار گیرند:

?> tsd install node --save
?> tsd install express --save

۵. حال با دستور ذیل، وارد محیط Visual Studio Code یا به طور مخفف VSCode می‌شویم:

?> code .

۶. برنامه را با استفاده از کلیدمیان‌بر، F5، اجرا می‌کنیم. در اولین زمان اجرا، و در کادر Select Debug Environment، از ما سوالی پرسیده می‌شود که باید گزینه Node.js را انتخاب کنیم. با این انتخاب، پوشه‌ای به نام vscode. ایجاد شده و در داخل آن فایلی به نام launch.js ایجاد می‌گردد.

۷. حال فایلی به نام app.js در Root پروژه ایجاد کرده و اقدام به برنامه‌نویسی نمایید.

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

  • داریوش تصدیقی
۲۴
آذر

نسخه: ۱.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 خواهید دید.

  • داریوش تصدیقی
۲۹
آبان

در قسمت اول آموزش Node.js، ابتدا در Windows Command Prompt، دستور Node را اجرا کردیم تا Node Command Prompt‌ ظاهر شود. در آنجا، تعدادی از دستورات JavaScript را اجرا کردیم و نتیجه اجرای آنها را نیز دیدیم. ولی واقعیت آن است که معمولا از این روش برای نوشتن برنامه‌های Node.js استفاده نمی‌شود! معمولا سورس‌کدها را در داخل یک فایل نوشته و از Node می‌خواهیم تا برنامه ما را اجرا نماید.

برای شروع، ابتدا پوشه‌ای به نام Learn_001 ایجاد کرده و از طریق یک ویرایشگر ساده، مانند Notepad، اقدام به ایجاد یک فایل به نام app و با پسوند js می‌کنیم. معمولا عرف بر این است که اولین فایل پروژه، که فایل اصلی پروژه نیز به آن اطلاع می‌شود، به صورت app.js تعریف گردد.

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

console.log("Hello, World!");

حال از طریق Windows Command Prompt، وارد پوشه Learn_001 شده، و یکی از دستورات ذیل را اجرا می‌کنیم:

?> Node app.js

Hello, World!

و یا

?>Node app

Hello, World!

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

توجه:‌ از این به بعد، به یاد داشته باشید، هر جا که از عبارت <? استفاده کردیم، منظورمان محیط اصلی Windows Command Prompt بوده و هرگاه صرفا از < استفاده کردیم، منظورمان محیط اصلی Node Command Prompt می‌باشد.

مجددا پوشه دیگری در کنار پوشه Learn_001، و به نام Learn_002 ایجاد کرده و فایل دیگری به نام app.js و با محتوای ذیل ایجاد نموده و آن را ذخیره می‌کنیم:

for(var intIndex = 1; intIndex <= 5; intIndex++) {


console.log("Hello, World (" + intIndex + ")!");


}

از نظر رسم‌الخط، در زبان برنامه‌نویسی JavaScript، معمولا آکولاد باز را در مقابل Block مربوطه نوشته و معمولا بعد از آکولاد باز و نیز قبل از آکولاد بسته، یک خط خالی ایجاد می‌کنیم.

حال مجددا از طریق Windwos Command Prompt، وارد پوشه Learn_002‌ شده و دستور ذیل را اجرا می‌کنیم:

?> Node app.js

Hello, World (1)!
Hello, World (2)!
Hello, World (3)!
Hello, World (4)!
Hello, World (5)!

همانگونه که حس کردید، برنامه‌نویسی در محیط‌های ساده‌ای مانند Notepad، چندان خوشایند و دلچسب نمی‌باشد! چرا که اولا هیچ Intellisense در آن وجود نداشته و ثانیا تا قبل از اجرای برنامه، از اشتباه یا بی‌دقتی‌های خود مطلع نخواهیم شد. ولی خبر خوش این است که ویرایشگرهای بسیار زیادی برای برنامه‌نویسی به زبان JavaScript وجود دارد. شاید در حال حاضر بتوان بهترین گزینه را محیط Visual Studio Code معرفی کرد. دقت کنید! اشتباه نکنید! این محیط با محیط Visual Studio که قبلا با آن کار می‌کرده‌اید، بسیار متفاوت است! مهترین ویژگی Visual Studio Code این است که Cross Platform می‌باشد! یعنی شما می‌توانید وارد نشانی http://code.VisualStudio.com شده و بسته به نوع سیستم عامل خود (Windows, Mac, Linux) نسخه مناسب را بارگزاری، نصب و اجرا نمایید.

در آموزش‌های بعد، کمی در رابطه با محیط Visual Studio Code صحبت خواهیم کرد و از این پس، سورس‌کدها و پروژه‌های خود را در قالب این محیط ارایه خواهیم نمود.

- با تشکر از سرکار خانم مهندس مریم تفس عزیز، که در ویرایش این متن، مرا یاری داده است.

  • داریوش تصدیقی
۲۴
آبان

نکاتی در رابطه با حذف اسناد (Documents) و حذف مجموعه‌ها (Collections)

برای اطلاعات (اسناد) از دستور remove، استفاده می‌کنیم. در صورتی که بخواهیم، کلیه اسناد مربوط به مجموعه users را حذف نماییم، از دستور ذیل استفاده می‌کنیم:

> db.users.remove( {} );

دقت کنید که در دستور فوق، به عنوان پارامتر ورودی دستور remove، از {}‌ استفاده کرده‌ایم. در نسخه‌های قبل از ۲.۶ بانک اطلاعاتی MongoDB، در صورتی که صرفا از دستور ()remove، و بدون پارامتر استفاده می‌کردیم، کلیه اسناد حذف می‌گردیدند، ولی از نسخه ۲.۶ به بعد، نوشتن {} الزامی است.

دقت داشته باشید که دستور فوق، کلیه اسناد مربوط به مجموعه users، را حذف کرده، ولی شاخص‌های (indexes)، آنرا را حذف نمی‌کند!

برای حذف مجموعه users، از دستور drop و به شکل ذیل استفاده می‌کنیم:

> db.users.drop();

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

در صورتی که بخواهیم برای حذف اسناد از شرطی استفاده نماییم، می توانیم شرط خود را در قالب یک عبارت JSON، اعلام نماییم.

می‌خواهیم کلیه اسناد users که مقدار فیلد "firstName" آنها، "Dariush" می‌باشد را حذف نماییم. برای این منظور از دستور ذیل استفاده می‌کنیم:

> db.users.remove( { "firstName" : "Dariush" } );

می‌خوایم کلیه اسناد users که مقدار فیلد "age" آنها، بزرگ‌تر از ۲۰ می‌باشد را حذف نماییم. برای این منظور از دستور ذیل استفاده می‌کنیم:

> db.users.remove( { "age" : { $gt : 20 } } );

در صورتی که بخواهیم تنها یک سند، با توجه به شرط مذکور حذف گردد، تنها کافی است که بعد از پارامتر {}، از true و یا عدد ۱ استفاده نماییم.

می‌خواهیم اولین سندی از مجموعه users، که فیلد "firstName"، آن برابر مقدار "Dariush" می‌باشد را حذف نماییم. برای این منظور از یکی از دستورات ذیل استفاده می‌کنیم:

> db.users.remove( { "fristName" : "Dariush" } , 1 );

> db.users.remove( { "fristName" : "Dariush" } , true );


  • داریوش تصدیقی
۱۷
آبان

در این درس، فرض بر آن است که در بانک اطلاعاتی test قرار داریم و در داخل این بانک اطلاعاتی، تعدادی سند، در مجموعه users قرار دارد.

با دستور ذیل فهرست کلیه اسناد (کاربران) موجود در مجموعه users نمایش داده می شود:

> db.users.find();

با استفاده از یک عبارت JSON و ارسال آن به عنوان پارامتر ورودی find، می توانیم اسناد خاصی (محدود شده) را بدست آوریم. به عنوان نمونه، با استفاده از دستور ذیل می‌توانیم فهرست اسنادی (کاربرانی) را مشاهده نماییم که نام آنها دقیقا Dariush می‌باشد:

> db.users.find( { "firstName" : "Dariush" } );

اصطلاحا به این پارامتر ورودی، Criteria گفته می‌شود.

با استفاده از دستور ذیل می‌توانیم، فهرست کاربرانی که سن آنها بزرگتر از ۲۰ سال می‌باشد را مشاهده نماییم:

> db.users.find( { "age" : { $gt : 20 } } );

با استفاده از دستور ذیل می‌توانیم، فهرست کاربرانی که سن آنها کمتر از ۳۰ سال می‌باشد را مشاهده نماییم:

> db.users.find( { "age" : { $lt : 30 } } );

با استفاده از دستور ذیل می‌توانیم، فهرست کاربرانی را که سن آنها بزرگتر یا مساوی ۲۰ سال می‌باشد را مشاهده نماییم:

> db.users.find( { "age" : { $gte : 20 } } );

با استفاده از دستور ذیل می‌توانیم، فهرست کاربرانی که سن آنها کمتر یا مساوی ۳۰ سال می‌باشد را مشاهده نماییم:

> db.users.find( { "age" : { $lte : 30 } } );

با استفاده از دستور ذیل می‌توانیم، فهرست کاربرانی که سن آنها بزرگتر از ۲۰ سال و کوچکتر از ۳۰ سال می‌باشد را مشاهده نماییم (دقت داشته باشید که در این درس از مفهموم AND استفاده شده است):

> db.users.find( { "age" : { $gt : 20 } , "age" : { $lt : 30 } } );

با استفاده از دستور ذیل می‌توانیم، فهرست کاربرانی که سن آنها کمتر از ۲۰ سال یا بزرگتر از ۳۰ سال می‌باشد را مشاهده نماییم (دقت داشته باشید که در این درس از مفهموم OR استفاده شده است):

> db.users.find( { $or : [ { "age" : { $lt : 20 } } , { "age" : { $gt : 30 } } ] } );

نکته: در درس‌های قبل تا حدودی با ساختار عبارات JSON آشنا شدیم. ولی بد نیست که نکته دیگری را نیز به آن اضافه نماییم. با استفاده از [ ] می‌توانیم یک آرایه (Array) تعریف کنیم. همانطور که در آخرین دستور فوق ملاحظه می کنید، دو شرط مربوط به کوچکتر از ۲۰ سال بودن سن و نیز بزرگتر از ۳۰ سال بودن سن، به عنوان دو عبارت JSON، در داخل یک آرایه قرار گفته‌اند.

نکته: یکی از نکاتی که باید بدان اشاره نماییم، آن است که تمام پارامترهای ورودی که از این پس به توابع MongoDB ارسال می‌کنیم، باید دارای ساختار JSON باشند. اجازه دهید که با تابع دیگری به نام sort آشنا شویم.

با استفاده از تابع sort و ارسال یک عبارت JSON به آن، مشخص می‌کنیم که نتیجه اطلاعات، مرتب شده بر اساس چه فیلد و یا فیلدهایی نمایش داده شوند. فرض کنید که می خواهیم فهرست کاربران را مرتب شده بر حسب سن آنها بدست آوریم، برای این منظور از دستور ذیل استفاده می‌کنیم:

> db.users.find().sort( { "age" : 1 } );

در مثال فوق، عدد یک (۱) مشخص می‌کند که می‌خواهیم نتیجه اطلاعات (فهرست کاربران)، مرتب شده بر روی فیلد سن، و به صورت از کوچک به بزرگ (Ascending) نمایش داده شوند. در صورتی که به جای عدد یک (۱) از عدد منفی یک (۱-) استفاده نماییم، اطلاعات کاربران، مرتب شده بر روی فیلد سن، و به صورت از بزرگ به کوچک (Descending) نمایش داده خواهند شد.

فرض کنید که می‌خواهیم فهرست کاربران را مرتب شده برحسب سن (از کوچک به بزرگ) و نیز نام آنها (از بزرگ به کوچک) مشاهده نماییم. برای این منظور از دستور ذیل استفاده می‌کنیم:

> db.users.find().sort( { "age" : 1 , "firstName" : -1 } );

  • داریوش تصدیقی
۱۴
آبان

فرض کنید که در بانک اطلاعاتی test، قرار داریم. حال می‌خواهیم اقدام به ایجاد یک مجموعه (Collection) کرده، و در آن، یک سند (Document) درج (ایجاد) نماییم. نکته جالب این است که بر خلاف بانک‌های اطاعاتی RDBMS، که ابتدا جدول را با فیلدهای مشخص و با نوع خاص ایجاد کرده و سپس اقدام به درج (ایجاد) اطلاعات می‌کنیم، در بانک‌های اطلاعاتی NoSQL، خصوصا MongoDB، تنها کافی است که مستقیما اقدام به درج اطلاعات (سند) نماییم. با درج اولین سند، به طور خودکار مجموعه مورد نظر ایجاد می‌گردد. برای درج سند، تنها کافی است که پس از کلیدواژه db، نام مجموعه را نوشته، و پس از آن، از دستور insert، استفاده کرده و سند خود را در قالب ساختار JSON بنویسیم. در نمونه ذیل، فرض بر آن است که می‌خواهیم نام مجموعه مورد نظر، users باشد:

> db.users.insert( { "firstName" : "Dariush", "lastName" : "Tasdighi" } );
writeResult({ "nInserted" : 1 })

به همین سادگی! با دستور فوق، ابتدا مجموعه‌ای به نام users، ایجاد شده و سپس در داخل آن، یک سند، با دو فیلد به نام‌های firstName و lastName و با مقادیری که مشاهده می‌کنید، ایجاد می‌گردد.

عبارتی که به عنوان پارامتر ورودی تابع insert، نوشته شده است، یک عبارت JSON می‌باشد.

اجازه دهید قبل از ادامه بحث، کمی در مورد عبارات JSON، صحبت کنیم. به طور کلی، ایجاد یک عبارات JSON، بسیار ساده است! کافی است که در ابتدا و انتهای آن، از {} استفاده کرده، و در داخل آن، فیلدها را در داخل "" قرار داده، و سپس مقدار هر فیلد را پس از (:) نوشته، و برای جدا کردن فیلدها و مقادیرشان از دیگر فیلدها از (,) استفاده نماییم. توجه داشته باشید که مقادیر متنی هر فیلد، باید در داخل "" نوشته شود و برای مقادیر عددی (اعم از صحیح و یا اعشاری) و نیز مقادیر true و false، که مقادیر Boolean می‌باشند، نیازی به نوشتن "" وجود ندارد. به مثال ذیل توجه کنید:

{ "fullName" : "Dariush Tasdighi", "age" : 42, "salary" : 120.12, "active" : true }

مجددا در مورد عبارات JSON، مطالبی خواهیم گفت. ولی در حال حاضر، کفایت می‌کند.

با استفاده از دستور show collections می‌توانیم فهرست کلیه مجموعه‌های موجود در بانک اطلاعاتی جاری (test) را مشاهده نماییم:

> show collections
system.indexes
users

مجددا از دستور show dbs استفاده می‌کنیم، تا ببینیم که آیا بانک اطلاعاتی test، رسما ایجاد شده است یا خیر؟

> show dbs
local 0.078GB
test  0.078GB

همانگونه که ادعا کردیم، با ایجاد اولین سند، به طور خودکار، ابتدا بانک اطلاعاتی test، و پس از آن مجموعه users ایجاد می‌گردد.

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

> db.users.find();
{ "_id" : ObjectId("563bb647ab7cbdeddbb081f8"), "firstName" : "Dariush", "lastName" : "Tasdighi" }

توجه: دستور find، آن هم به شکل فوق، دقیقا معادل دستور SELECT * FROM users در SQL می‌باشد.

توجه: همانگونه که مشاهده می‌کنید، MangoDB، پس از درج (ایجاد) هر سند، به طور خودکار، یک فیلد به نام id_ و با مقداری تصادفی ولی کاملا منحصر به فرد، ایجاد می‌کند!

 

این مطلب هنوز به اتمام نرسیده است!

  • داریوش تصدیقی
۱۳
آبان

همانگونه که در مطلب قبلی عنوان گردید، با اجرای دستور MongoD، سرویس بانک اطلاعاتی، راه اندازی شده و قابل استفاده می‌باشد. دقت داشته باشید که از این پس پنجره Windows Command Prompt، دیگر قابل استفاده نمی‌باشد! و برای ادامه عملیات باید از پنجره دیگری استفاده نماییم. برای اینکه سرویس بانک اطلاعاتی راه‌اندازی شده را متوقف کنیم، تنها کافی است، وارد پنجره مربوط به آن شده، و از دکمه‌های ترکیبی CTRL + C استفاده نماییم.

در حالی که این پنجره باز می‌باشد، برای ادامه عملیات، پنجره Windows Command Prompt‌ دیگری باز کرده و در آن مجددا، وارد درایو C‌ و سپس پوشه MongoDB می‌شویم.

حال برای ارتباط برقرار کردن با سرویس بانک اطلاعات MongoDB، از دستور Mongo، استفاده می‌کنیم:

C:\MongoDB>Mongo
MongoDB shell version: 3.0.7
connecting to: test
>

با اجرای دستور فوق، وارد محیط مدیریت بانک اطلاعاتی MongoDB‌ می‌شویم. دقت داشته باشید که اولا در همان اجرای اولیه دستور فوق، بانک اطلاعاتی به نام local ایجاد شده، و دوما سیستم، به طور پیش فرض، تمایل به اتصال بانک اطلاعاتی به نام test دارد، هر چند که هنوز، بانک اطلاعاتی test ایجاد نشده است! خواهید دید، تا وقتی که مجموعه‌ای (Collection) در داخل بانک اطلاعاتی، مثلا test ایجاد نکنید، این بانک اطلاعاتی به طور رسمی ایجاد نمی‌گردد.

چگونه می‌توانیم متوجه شویم، در حال حاضر، درون چه بانک اطلاعاتی قرار داریم؟

با استفاده از دستور db می‌توانیم اطمینان حاصل کنیم که در حال حاضر درون چه بانک اطلاعاتی قرار داریم:

> db
test

چگونه می‌توانیم فهرست کلیه بانک‌های اطلاعاتی موجود در MongoDB را بدست آوریم؟

با استفاده از دستور show dbs می‌توانیم فهرست تمام بانک‌های اطلاعاتی موجود در MongoDB را مشاهده نماییم:

> show dbs
local   0.078GB

همانگونه که ملاحظه می‌کنید، ما در حال حاضر، درون بانک اطلاعاتی test قرار داریم، ولی نام آن، در فهرست بانک‌های اطلاعاتی وجود ندارد! همانگونه که بیان گردید، تا وقتی که درون بانک اطلاعاتی، مجموعه‌ای ایجاد نکنیم، به طور رسمی، بانک اطلاعاتی ایجاد نمی‌گردد.

چگونه می‌توانیم، وارد بانک اطلاعاتی دیگری شویم؟

با استفاده از دستور use می‌توانیم از بانک اطلاعاتی جاری خارج شده و وارد بانک اطلاعاتی دیگری بشویم:

> use local
switched to db local

حال اگر مجددا از دستور db استفاده نماییم، سیستم به ما خواهد گفت که در حال حاضر، درون بانک اطلاعاتی local قرار داریم:

> db
local

چگونه می‌توانیم از فهرست مجموعه‌های موجود در بانک اطلاعاتی جاری، مطلع شویم؟

با استفاده از دستور show collections می‌توانیم فهرست کاملی از کل مجموعه‌های موجود درون بانک اطلاعاتی جاری را بدست آوریم:

> show collections
startup_log
system.indexes

حال مجددا سراغ بانک اطلاعاتی test می‌رویم تا تکنیک‌های مربوط به ایجاد مجموعه و نیز ایجاد، ویرایش، حذف و و فهرست‌گیری اطلاعات و غیره را در محیط MongoDB تجربه نماییم:

> use test
switched to db test

این مطلب هنوز تکمیل نشده است!

  • داریوش تصدیقی
۱۲
آبان

همانگونه که در مطلب قبل، در مورد ورود به پایگاه MongoDB، انتخاب برنامه، دانلود و نصب آن صحبت کردیم، در این مطلب می خواهیم طریقه راه اندازی آنرا توضیح دهیم.

در صورتی که فایل MSI را از پایگاه MongoDB دانلود کرده و اقدام به نصب آن کرده باشید، بسته به اینکه سیستم عامل ویندوز شما، ۶۴ بیتی و یا ۳۲ بیتی بوده و در ضمن، نسخه برنامه را به درستی دانلود و نصب کرده باشید، تعدادی فایل در یکی از نشانی های ذیل قرار خواهند گرفت:

C:\Program Files\MongoDB\Server\3.0\bin

و یا

C:\Program Files (x86)\MongoDB\Server\3.0\bin

برای اینکه هیجان کار را بیشتر کنیم، تا شما اطمینان حاصل کنید که صرفا Extract صورت گرفته و نصب واقعی در کار نبوده است، توصیه می کنیم که ابتدا پوشه ای در درایو C، مثلا به نام MongoDB ایجاد کرده، و سپس تمامی فایل هایی که در پوشه bin قرار دارند را به این پوشه جدید، کپی نمایید.

MongoDB برای ذخیره کردن اطلاعات خود، به مسیر پیش فرض data/db/ نیاز دارد. برای این منظور، وارد درایو C شده و اقدام به ایجاد پوشه ای به نام data کرده و در داخل پوشه data نیز، پوشه دیگری به نام db ایجاد نمایید. توجه داشته باشید که پوشه data، باید در ریشه درایو C ایجاد گردد! لازم به ذکر است که شما می توانید مسیر پیش فرض را تغییر دهید. در درس های آتی به این تنظیمات خواهیم پرداخت.

حال وارد محیط Windows Command Prompt شده و وارد درایو C‌ و سپس وارد پوشه MongoDB شوید. پس از ورود به این مسیر، در اولین اقدام دستور ذیل را نوشته، تا نسخه بانک اطلاعاتی MongoDB نمایش داده شود:

C:\MongoDB>MongoD --version
db version v3.0.7
git version: ...

توجه: دقت داشته باشید که تمامی پارامترهایی که در مقابل دستور MongoD نوشته می شوند، Case Sensitive بوده و باید با حروف کوچک نوشته شوند. در صورتی که به عنوان مثال، شما پارامتر version را به صورت VERSION بنویسید، با پیام خطا مواجه خواهید شد.

توجه: دقت داشته که خود دستورات، Case Sensitive نمی باشند، لذا در صورتی که شما دستور MongoD را به صورت mongod و یا MONGOD بنویسید، مشکلی در اجرای دستورات نخواهید داشت.

توجه:‌ دقت کنید که برای استفاده از پارامتر version، می توانید قبل از آن، از یک (-) و یا دو (-) استفاده کنید، ولی توصیه می شود که از دو (-) استفاده نمایید.

با استفاده از دستور ذیل، شما می توانید، کلیه پارامترهایی که مورد استفاده دستور MongoD قرار می گیرند را مشاهده نمایید:

C:\MongoD>MongoD --help

حال می خواهیم سرور MongoDB را راه اندازی نماییم. برای این منظور، تنها کافی است که از دستور ذیل استفاده نمایید:

C:\MongoD>MongoD

پس از اجرای این دستور، بسته به تنظیمات Security سیستم عامل ویندوزتان، ممکن است که پنجره ای ظاهر شود. در صورت ظاهر شدن این پنجره، بر روی دکمه Allow Access کلیک نمایید. بدین ترتیب، سرور MongoDB راه اندازی شده و آماده استفاده می باشد.

- با تشکر از سرکار خانم مهندس مریم تفس عزیز، که در ویرایش این متن، مرا یاری داده است.

  • داریوش تصدیقی
۱۲
آبان
در این مطلب می خواهم به معرفی بانک اطلاعاتی MongoDB بپردازم، تا با امکانات و ویژگی های آن آشنا شده و در صورت لزوم از آن استفاده نمایید...

MongoDB یک بانک اطلاعاتی NoSQL یا Non SQL یا Non Relational است. یعنی بر خلاف اکثر بانک های اطلاعاتی که می شناسید (Access, SQL Server, Oracle, MySQL)، یک بانک اطلاعاتی RDBMS نمی باشد! پس تا اینجا به این نتیجه می رسیم که در بانک های اطلاعاتی NoSQL چیزی به معنی Relation وجود ندارد!

بر خلاف SQL Server و همانند My-SQL و Oracle، بانک اطلاعاتی MongoDB، مستقل از سیستم عامل می باشد. یعنی Cross Platform می باشد. این بدان معنی است که تقریبا روی اکثر سیستم عامل ها نصب و راه اندازی می شود.

در MongoDB، به جای جدول (Table)، مفهومی به نام مجموعه (Collection) وجود دارد.

در MongoDB، به جای سطر (Row or Record)، مفهومی به نام سند (Document) وجود دارد، به همین دلیل، اصطلاحا می گویند که این بانک اطلاعاتی، Document Oriented می باشد.

در MongoDB، تراکنش (Transaction) وجود ندارد!

در تمام بانک های اطلاعاتی RDBMS، برای استفاده از جداول، ابتدا جدول را ایجاد کرده و سپس باید! ساختار جدول را تعریف کنیم. یعنی باید بگوییم که در این جدول چه فیلدهایی داریم و جنس هر فیلد را مشخص کنیم. بر خلاف بانک های اطلاعاتی RDBMS، بانک های اطلاعاتی NoSQL، اصطلاحا Schema-Less می باشند! یعنی دارای هیچ ساختار معینی از نظر فیلد و جنس فیلد ندارند! یعنی شما می توانید به راحتی ابتدا مجموعه (Collection) خود را تعریف کرده و بدون نیاز به تعریف فیلدها و جنس آنها، اقدام به درج اطلاعات (سند) نمایید، و این خیلی هیجان انگیز است.

در بسیاری از بانک های اطلاعاتی RDBMS، مانند SQL Server و Oracle، ما از زبانی به نام T-SQL استفاده می کنیم، در حالی که در بانک اطلاعاتی MongoDB‌، از زبان JavaScript استفاده می کنیم! شاید به همین دلیل است که در این وبلاگ، سعی خواهم کرد که روی مفاهیم و دستورات جاوا اسکریپت تمرکز بیشتری نمایم.

ضمن آنکه بانک های اطلاعاتی NoSQL برای مصارف Big Data استفاده می شوند، ولی در پروژه های Small, Medium, Large Scale نیز استفاده از آنها خالی از لطف نیست، چرا که سرعت و کارایی آنها به طرز چشم گیری فوق العاده بوده و قابل مقایسه با بانک های اطلاعاتی RDBMS نمی باشند.

برای دانلود MongoDB، می توانید به پایگاه http://www.MongoDB.com مراجعه نموده و با توجه به سیستم عامل خود، و با عنایت به ۳۲ بیتی و یا ۶۴ بیتی بودن آن، نسخه مناسب را انتخاب کنید. متاسفانه در حال حاضر، به دلیل تحریم های بی شرمانه! در لحظه دانلود با خطایی مواجه خواهید شد و امکان دانلود وجود ندارد! به هر حال امیدوارم، در زمانی که شما این مطلب را مطالعه می کنید، این محدودیت از این سایت و دیگر سایت ها، از بین رفته باشد.

مواردی که در خصوص MongoDB، خیلی جالب و هیجان انگیز می باشد، آن است که کل فایل ZIP و یا MSI که دانلود می کنید، کمتر از هشتاد (۸۰) مگابایت می باشد! و اساسا عملیات نصب، به آن معنی همیشگی نیست! بلکه صرفا یک سری فایل در محلی که شما تعیین کرده اید، Extract می شود. شما می توانید حتی فایل های مقصد را در محل و پوشه دیگری کپی کرده و در محل جدید، بانک اطلاعاتی MongoDB را راه اندازی نمایید.

توصیه می کنم که به نشانی ذیل مراجعه کنید و مطلبی که در مقایسه دو بانک اطلاعاتی NoSQL و RDBMS نوشته شده است را مطالعه کنید. در این مقاله دو بانک اطلاعاتی MongoDB و MySQL با هم مقایسه شده اند:

این مطلب هنوز تکمیل نشده است!
  • داریوش تصدیقی
۱۲
آبان

Functions are Objects

The typeof operator in JavaScript returns "function" for functions.

But, JavaScript functions can best be described as objects.

JavaScript functions have both properties and methods.

The arguments.length property returns the number of arguments received when the function was invoked:


در زبان جاوا اسکریپت، با استفاده از دستور typeof، شما می توانید جنس یک متغیر را دریافت نمایید. در صورتی که به این دستور، نام یک تابع و یا متغیری که تابع در آن ذخیره شده است را ارسال نمایید، جنس آنرا function اعلام می کند.

ولی واقعیت این است که بهتر است، توابع را به عنوان اشیاء در نظر بگیریم.

در زبان جاوا اسکریپت، توابع می توانند Property و Method داشته باشند.

در صورتی که در داخل یک تابع از دستور arguments.length استفاده نمایید، می توانید به تعداد پارامترهایی که تابع توسط آنها اجرا شده است، دست پیدا کنید.


function myFunction(a, b) {
    return arguments.length;
}


The toString() method returns the function as a string:


در صورتی که در داخل سورس کد، بعد از نام تابع و یا متغیری که تابع را در داخل آن ذخیره کرده اید، از تابع toString استفاده نمایید، می توانید، کل قسمت مربوط به تعریف تابع را به صورت متنی بدست آورید.


function myFunction(a, b) {
    return a * b;
}

var txt = myFunction.toString();


A function defined as the property of an object, is called a method to the object.
A function designed to create new objects, is called an object constructor.


در صورتی که در داخل یک تابع، تابعی تعریف نمایید، تابع درونی Method نامیده می شود.

تابعی که برای ایجاد یک شیء، نوشته می شود، سازنده شیء نامیده می شود.


این مطلب هنوز در حال تکمیل می باشد!

مرجع: http://www.W3Schools.com

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