مقدمه
در این درس با یک ماژول built-in در Node.js با نام http آشنا میشویم که همانطور که نامش نشان میدهد، برای
مدیریت درخواستهای HTTP کاربرد دارد. ضمن آشنایی با ماژول http، یک وبسرور ساده را با استفاده از جاوااسکریپت
و Node.js ایجاد میکنیم و به این ترتیب، این امکان را برای اپلیکیشن خود فراهم میکنیم که بتوان از طریق مرورگر
(یا سایر ابزارهای کلاینت) با آن ارتباط برقرار کرد.
وبسرور چیست؟
پایه و بنیاد یک اپلیکیشن Node را یک وبسرور تشکیل میدهد. این وبسرور است که صفحات وب، تصاویر و سایر انواع
محتوا را برای کاربران نهایی سایت یا اپلیکیشن ما لود میکند. بنابراین، بهتر است قبل از هر چیز، با مفاهیم
مربوط به وبسرورها آشنا شویم.
وبسرورها و HTTP
وبسرور نرمافزاری است که درخواستهای شبکه را پردازش کرده و پاسخ مناسب را تولید و بارگذاری میکند. یک
وبسرور را میتوانید مثل یک تحویلدار بانک در نظر بگیرید. همانطور که تحویلدار وظیفه دارد که درخواستهای
شما را برای کارهایی مانند واریز و برداشت پردازش کند و این پردازشها را بر اساس پروتکل مشخصی انجم میدهد،
وبسرورها نیز از یک پروتکل جهانی با نام HTTP یا Hypertext Transfer Protocol برای پردازشهای خود استفاده
میکنند. یکی از راههای ارتباطی بین کلاینت و سرور، متدهای HTTP است. این متدها مشخصکنندهی نوع درخواست
هستند که برای نمونه میتواند بارگذاری یک صفحهی وب جدید یا بهروزرسانی پروفایل و موارد متعدد دیگر باشد.
GET و POST دو تا از مهمترین و پرکاربردترین متدهای HTTP هستند. یک متد GET معمولاً از سرور درخواست اطلاعات
دارد و سرورها هم عموماً اطلاعات یا محتوایی را به عنوان پاسخ برمیگردانند. مثلاً کلیک روی یک لینک باعث
ارسال یک درخواست از نوع GET میشود و سرور صفحهی مورد نظر را به عنوان پاسخ برمیگرداند و مرورگر آن را
نمایش میدهد. اما یک درخواست از نوع POST با ارسال اطلاعات برای سرور همراه است و سرور پس از پردازش این
اطلاعات، ممکن است این اطلاعات را در جایی مثل یک دیتابیس ذخیره کند، کاربر را به صفحهی دیگری هدایت
(redirect) کند و غیره. مثلاً وقتی یک فرم ثبتنام را پر میکنید، دادههای فرم برای سرور ارسال میشوند و
سرور پردازشهای لازم را انجام داده و نتیجهی مناسب را برمیگرداند.
پروتکل HTTP یک نسخهی امن به نام HTTPS دارد که در آن دادهها به صورت رمزنگاریشده بین کلاینت و سزوز رد و
بدل میشود و به این ترتیب، خیلی از حملات خرابکارانه را بیاثر میکند.
برای مثال، وقتی قصد دارید از موتور جستجوی گوگل استفاده کنید، مرورگر شما در پشت صحنه درخواستی را برای سرورهای
گوگل ارسال میکند و این سرورها با پردازش درخواست، نتیجهی مناسب را تولید میکنند که در نهایت، منجر به نمایش
صفحهی اصلی google.com میشود. این مکانیزم درخواست و پاسخ در واقع، کانال ارتباطی بین کاربر و اپلیکیشن است.
در ادامه، یک اپلیکیشن Node مجهز به یک وبسرور را ایجاد و اجرا میکنیم تا مفاهیم بالا را در عمل ببینید.
راهاندازی پروژه با NPM
در اولین گام از فرایند ایجاد یک اپلیکیشن Node باید یک پروژه تعریف و اصطلاحاً آن را راهاندازی (initialize)
کنیم. پس ابتدا یک دایرکتوری با نام simple_server ایجاد کرده و سپس کامند npm init را درون این دایرکتوری اجرا
میکنیم.
$ mkdir simple_sever
$ cd simple_server
$ npm init
با اجرای دستور npm init چند سوال در مورد تنظیمات پروژه از ما پرسیده میشود که میتوانیم با زدن کلید Enter
گزینهی پیشفرض را تأیید کنیم. در نهایت، یک فایل با نام package.json ایجاد میشود. حالا دایرکتوری پروزه یعنی
simple_server را در یک IDE مانند vscode باز کنید و نگاهی به محتویات فایل package.json بیندازید. در جایی از
این فایل، عبارت main: index.js را میبینید که به این معناست که فایل اصلی یا Entry point پروژه که در نهایت
اجرا خواهد شد، index.js نام دارد. آن را به app.js تغییر دهید و یک فایل با همین نام در دایرکتوری پروژه ایجاد
کنید. این کار را میتوانید با استفاده از محیط گرافیکی IDE و یا با کامندی مثل touch app.js انجام دهید.
خوب پس تا اینجا ما در دایرکتوری پروژه که آن را simple_server نامیدیم، دو فایل داریم: یکی فایل package.json
که اطلاعات مربوط به پروژه، وابستگیها (dependencies) و گزینههای کانفیگ پروژه را نگه میدارد و دیگری فایل
app.js که فایل اصلی پروژه یا اصطلاحاً Entry point یا نقطهی ورود پروژه محسوب میشود.
کدنویسی اپلیکیشن
ایجاد یک وبسرور در Node کاری بسیار ساده و سرراست است. فایل app.js را باز کنید و کد زیر را در آن وارد کنید.
app.js
const http = require('http');
const app = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, World!\n');
});
const PORT = 3000;
const HOSTNAME = '127.0.0.1';
app.listen(PORT, HOSTNAME, () => {
console.log(`Server running at http://${HOSTNAME}:${PORT}/`);
});
اتفاقات کد بالا از این قرار است:
-
در اولین خط از کد بالا، ماژول http به پروژه وارد (import) شده است. http یک ماژول built-in است و
بنابراین، برای اضافه کردن آن به پروژه، کافیست از یک متد require() استفاده کنیم. این ماژول را که امکانات لازم
برای ساخت یک سرور را دارد، در متغیری به همبن نام ذخیره کردهایم.
-
در ادامه، با استفاده از یک متد از ماژول http با نام createServer() یک شیء وبسرور ایجاد کردهایم. آرگومان
این متد یک تابع callback است که وقتی درخواستی به سرور برسد، اجرا میشود. در این تابع req شیء درخواست یا
request و res شیء پاسخ یا response است. در بلاک تابع callback متد writeHead() روی شیء response فراخوانی شده
و اولاً کد پاسخ یا response code را روی 200 تنظیم کرده و ثانیاً نوع محتوا را با استفاده از یک http header
روی text/plain تنظیم کرده است. در نهایت، با استفاده از متد res.end() یک عبارت متنی به عنوان پاسخ تعیین شده
است.
-
سپس، یک شمارهی دلخواه (در اینجا 3000) را به عنوان پورت دسترسی به سرور تعیین کردهایم و IP متناظر با
localhost را نیز در متغیری به نام HOSTNAME ذخیره کردهایم.
-
در نهایت، پورت و هاست را به عنوان آرگومان به متد app.listen() دادهایم تا سرور به درخواستهای این هاست
و پورت گوش داده و به آنها پاسخ دهد. یک تابع callback نیز به عنوان آرگومان سوم این متد تعیین شده که با
استارت سرور، اجرا میشود.
اجرای اپلیکیشن
برای اجرای برنامه باید دستور node app.js را در ترمینال اجرا کنیم. اگر از vscode استفاده میکنید، نیازی به
خروج از محیط IDE و باز کردن ترمینال نیست، چون این IDE به یک ترمینال داخلی مجهز است. برای نمایش پنل ترمینال،
از منوی View گزینهی Terminal را انتخاب کنید و یا کلیدهای ترکیبی CTRL + ` (کنترل و بکتیک) را فشار دهید.
حالا اول مطمئن شوید که در دایرکتوری simple_server هستید و سپس، کامند node app.js را اجرا کنید. با این کار،
سرور استارت شده و آمادهی پاسخدهی به درخواستهاست.
برای تست این موضوع، یک مرورگر باز کنید و آدرس http://127.0.0.1:3000 را در نوار آدرس وارد کنید. اگر مشکلی
وجود نداشته باشد، باید عبارت Hello, World! را ببینید.
برای متوقف کردن سرور، میتوانید در ترمینال کلیدهای CTRL + C را فشار دهید.