درسی که امروز برای شما دوستان در نظر گرفتهایم، شاید از نظر زمانی، کمی زود باشد! ولی تجربه نشان داده است، در کلاسهای آموزشی، به دلیل هیجانانگیز بودن موضوع، ارایه این مطلب آموزشی، بسیار مفید و جذاب بوده، و انگیزه نوآموزان را برای یادگیری 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 در بالای مرورگر، ظاهر شده و متوقف نمیگردد!