در پاسخ به اینکه "آیا Node.js یک زبان برنامهنویسی است؟" باید گفت که خیر، Node.js زبان برنامهنویسی محسوب نمیشود بلکه یک محیط اجرایی (Runtime Environment) است که امکان اجرای کد جاوا اسکریپت را در سمت سرور و خارج از محیط مرورگر فراهم میکند. محیط Node.js بر پایه موتور جاوا اسکریپت V8 گوگل کروم ساخته شده است. موتور V8، جاوا اسکریپت را به کدی بسیار بهینه تبدیل میکند که نتیجه آن افزایش سرعت و کارایی در اجرای برنامهها است.
محیط Node.js قابلیتهای جاوا اسکریپت را گسترش میدهد و امکاناتی نظیر دسترسی به سیستم فایل، مدیریت ارتباطات شبکه و عملیات ورودی/خروجی غیرهمزمان را فراهم میکند. این ویژگیها آن را به ابزاری قدرتمند برای توسعه سمت سرور تبدیل کردهاند.
اگرچه جاوا اسکریپت زبان اصلی مورد استفاده در Node.js است اما این محیط ابزارها و فریم ورک هایی ارائه میدهد که توسعه برنامههای مقیاسپذیر و با کارایی بالا مانند وب سرورها و API ها را آسانتر میکند. معماری رویداد محور و بدون انسداد آن، Node.js را به گزینهای ایدهآل برای برنامههایی تبدیل کرده که نیازمند مدیریت درخواستهای همزمان هستند.
در بخش اول مقاله بیان گردید که Node.js یک محیط قدرتمند برای برنامهنویسی سمت سرور با استفاده از جاوا اسکریپت است و نباید با زبان برنامهنویسی اشتباه گرفته شود. در این قسمت نیز تلاش شده تا در خصوص معماری، استریم ها، خطاها و نحوه اشکال زدایی در محیط Node.js توضیحات لازم ارائه گردد.
معماری محیط Node.js
Node.js از معماری تک رشته ای استفاده میکند که با کمک Event Loop میتواند هزاران درخواست را بهطور همزمان مدیریت نماید. این معماری، برای عملیات ورودی/خروجی بهینهسازی شده و بدون انسداد پردازشها، درخواستها را مدیریت میکند.
تصویر(1)
اجزای اصلی معماری محیط Node.js:
- حلقه رویداد (Event Loop): وظیفه اصلی حلقه رویداد، مدیریت درخواستهای همزمان و تخصیص وظایف به منابع سیستم است.
- مدل غیرهمزمان: این مدل، عملیات ورودی/خروجی (I/O) را بدون توقف سایر پردازشها اجرا میکند که منجر به بهبود کارایی و افزایش سرعت برنامهها میشود.
- ماژولهای داخلی و خارجی: محیط Node.js شامل ماژولهای داخلی است که دسترسی به قابلیتهایی نظیر سیستم فایل، شبکه و عملیات پردازش را فراهم میکنند. همچنین توسعهدهندگان میتوانند از ماژولهای خارجی موجود در NPM برای گسترش قابلیتهای برنامه خود بهره ببرند.
تصویر(2)
این معماری خاص به Node.js امکان میدهد برنامههای مقیاسپذیر و کارآمد ایجاد کند که بهویژه برای برنامههای شبکهای و دادهمحور بسیار مناسب است.
این ویژگیها، محیط Node.js را تبدیل به ابزاری ایدهآل برای ساخت برنامههایی با نیازهای پیچیده و ترافیک بالا می کند. نود جی اس شامل ماژولهای متعددی می باشد که قابلیتهای پایه موردنیاز برای یک برنامه وب را فراهم میکنند.
برخی از این ماژولها در جدول زیر ذکر شدهاند:
ماژولهای اصلی |
توضیحات |
http |
شامل کلاسها، متدها و رویدادها برای ایجاد سرور HTTP در Node.js |
util |
شامل توابع کاربردی مفید برای توسعهدهندگان |
fs |
شامل رویدادها، کلاسها و متدهایی برای کار با عملیات ورودی/خروجی فایل |
url |
شامل متدهایی برای تجزیه URL |
querystring |
شامل متدهایی برای کار با رشتههای کوئری (Query String) |
stream |
شامل متدهایی برای مدیریت دادههای استریم |
zlib |
شامل متدهایی برای فشردهسازی یا اکسترکت فایلها |
جدول(1)
کنسول
ماژول کنسول روشی برای اشکالزدایی فراهم میکند که مشابه کنسول پایه جاوا اسکریپت در مرورگرهای اینترنتی است. این ماژول پیامها را با خروجی استاندارد (stdout) و خطای (stderr) چاپ میکند.
تصویر(3)
کلاستر
نود جی اس بر اساس مفهوم برنامهنویسی تکرشتهای طراحی شده است. ماژول کلاستر امکان پردازش چندرشته ای را فراهم میکند و این کار را با ایجاد فرآیندهای فرزند انجام میدهد که بهطور همزمان اجرا میشوند و از یک پورت مشترک در سرور استفاده میکنند.
کلاستر را میتوان به روش زیر در یک برنامه اضافه کرد:
تصویر(4)
گلوبال
اشیای گلوبال محیط Node.js، برای تمامی ماژولها در دسترس هستند. این اشیا شامل توابع، ماژولها، رشتهها و موارد مشابه میشوند. برخی از اشیای گلوبال نود جی اس در جدول زیر آورده شدهاند:
اشیاء سراسری |
توضیحات |
__dirname |
نام دایرکتوری که کد برنامه در آن قرار دارد را مشخص میکند. |
__filename |
مسیر کامل و نام فایل جاری (یعنی فایلی که در آن کد نوشته شده است) را نشان میدهد. |
exports |
ارجاعی به module.exports است که برای تایپ کوتاهتر کاربرد دارد. |
module |
ارجاعی به ماژول فعلی است. |
require |
برای وارد کردن ماژولها، فایلهای محلی و همچنین JSON استفاده میشود. |
جدول(2)
مدیریت خطا
برنامههای Node.js معمولا با چهار نوع خطا مواجه میشوند.
تصویر(4)
- خطاهای استاندارد جاوا اسکریپت:
<EvalError>, <SyntaxError>, <RangeError>, <ReferenceError>, <TypeError> و <URIError>
- خطاهای سیستمی:
<File does not exist>, <closed socket>
- خطاهای مرتبط با کاربر: خطاهای ایجاد شده توسط کاربر در کد
- خطاهای منطقی: نوع خاصی از خطا که با نقض شروط موجود در کد رخ میدهد.
مدیریت خطاها در محیط Node.js
در Node.js، خطاها از طریق استثنائات مدیریت میشوند. به عنوان مثال، خطایی که هنگام تقسیم یک عدد بر صفر رخ میدهد را در نظر بگیرید. این خطا باعث توقف اجرای برنامه نود جی اس میشود، در نتیجه باید این خطا را مدیریت کرد تا برنامه بتواند به اجرای عادی خود ادامه دهد.
تصویر(5)
استریمها (Streams) در محیط Node.js
استریمها در Node.js ابزارهایی قدرتمند برای مدیریت دادهها به صورت مداوم و بهینه هستند و امکان خواندن و نوشتن دادهها را هنگام انتقال، بدون نیاز به بارگذاری کامل آنها در حافظه، فراهم میکنند. این ویژگی برای کار با دادههای حجیم یا انتقال اطلاعات بسیار کارآمد است.
در محیط Node.js چهار نوع استریم وجود دارد:
- استریمهای خواندنی (Readable):
این استریمها برای دریافت دادهها از یک منبع مانند فایل، درخواست HTTP یا منبع خارجی دیگر مورد استفاده قرار میگیرند. با استفاده از این نوع استریمها، دادهها در چند بخش دریافت و پردازش میشوند که سرعت و بهرهوری را افزایش میدهد. - استریمهای نوشتنی (Writable):
استریمهای نوشتنی برای ارسال دادهها به یک مقصد مانند ذخیرهسازی در فایل یا ارسال پاسخ HTTP کاربرد دارند. این استریمها امکان نوشتن تدریجی دادهها را بدون اشغال حجم زیادی از حافظه فراهم میکنند. - استریمهای دو طرفه (Duplex):
این نوع استریمها قابلیت خواندن و نوشتن را به طور همزمان دارند. بهعنوان مثال، سوکتهای شبکه از این نوع استریم استفاده میکنند که امکان ارسال و دریافت دادهها را به طور همزمان فراهم میآورند. - استریمهای تبدیلی (Transform):
این استریمها نوع خاصی از استریمهای دو طرفه هستند که امکان تغییر دادهها حین خواندن یا نوشتن را فراهم میکنند. بهعنوان مثال، رمزگذاری دادهها، فشردهسازی یا تغییر فرمت اطلاعات، با استفاده از این استریمها انجام میشود.
مزایای استفاده از استریمها در محیط Node.js:
- کاهش استفاده از حافظه: جای بارگذاری کامل دادهها در حافظه، استریمها دادهها را به صورت قطعهای مدیریت میکنند.
- افزایش سرعت پردازش: پردازش تدریجی دادهها زمان کلی اجرا را کاهش میدهد.
- کاربرد در انتقال دادههای حجیم: استریمها بهویژه برای انتقال فایلهای بزرگ یا کار با دادههای حجیم، کارایی بالایی دارند.
محیط Node.js با استفاده از این ساختار پیشرفته، امکان مدیریت بهینه دادهها را برای برنامههای مدرن فراهم میکند.
بافر (Buffer) در محیط Node.js
بافر در Node.js یک ماژول داخلی است که برای مدیریت دادههای باینری خام در استریمها مورد استفاده قرار میگیرد. این ابزار امکان نگهداری و پردازش دادهها بدون تبدیل آنها به فرمتهای دیگر را فراهم میکند.
ویژگیهای کلیدی بافر:
- مدیریت دادههای خام: بافر برای کار با دادههایی استفاده میشود که مستقیماً تحت فرمت باینری ارائه میشوند.
- ایجاد بافر با طول مشخص: برای ایجاد یک بافر خالی با طول خاص، از دستور Buffer.alloc استفاده میشود.
تصویر(6)
- بهینهسازی مدیریت دادهها: بافر به محیط Node.js اجازه میدهد دادههای ورودی/خروجی را با سرعت بالا و بدون نیاز به مصرف زیاد حافظه، مدیریت کند.
بافرها بهویژه در جریانها و هنگام کار با دادههای ورودی/خروجی (I/O) نقش مهمی ایفا میکنند. این قابلیت موجب میشود Node.js در توسعه برنامههای دادهمحور و آنلاین، عملکرد بهتری ارائه دهد.
دامین
در ماژول Domain نود جی اس، خطاهای اتصال داخلی (Implicit Binding) و اتصال خارجی (Explicit Binding)، نحوه اتصال منابع و کد به دامنه را مشخص می کنند. این تفاوتها اهمیت زیادی در نحوه مدیریت خطاها دارند:
- اتصال داخلی: در اتصال داخلی، منابع کاملا خودکار به دامنه متصل میشوند، بدون اینکه به صورت دستی این کار انجام شود.
- اتصال خارجی: در اتصال خارجی، منابع به صورت دستی با دامنه مرتبط میشوند. این کار از طریق متدهایی مانند ()domain.add یا ()domain.bind انجام میگردد. توسعهدهنده باید به صورت صریح مشخص کند که کدام منابع باید به دامنه مرتبط شوند.
DNS در محیط Node.js
ماژول DNS برای اتصال به یک سرور DNS و ترجمه نام دامنه استفاده میشود. این کار از طریق روش زیر انجام میگردد:
تصویر(7)
همچنین ماژول DNS برای ترجمه نام دامنه بدون نیاز به ارتباط شبکه استفاده میشود. این کار از طریق روش زیر انجام میگیرد:
تصویر(8)
اشکالزدا (Debugger)
محیط Node.js شامل ابزاری پیشفرض برای اشکالزدایی است که از طریق یک کلاینت در دسترس می باشد. این اشکالزدا امکانات پیشرفتهای ندارد اما از بررسی ساده کد پشتیبانی میکند. برای استفاده از این ابزار در ترمینال، میتوان کلمه کلیدی inspect را قبل نام فایل جاوا اسکریپت به کار برد. بهعنوان مثال، برای بررسی فایل myscript.js میتوانید از روش زیر استفاده کنید:
تصویر(9)
حال که با بخشهای اصلی محیط Node.js آشنا شدید، در ادامه به فریمورک Express نود جی اس پرداخته می شود.
فریمورک Express در محیط Node.js
Express یکی از فریمورکهای پرطرفدار و قدرتمند برای توسعه وب با Node.js است. این فریمورک بهعنوان لایهای بالاتر از Node.js عمل میکند و فرآیند توسعه برنامههای تحت وب و موبایل را تسهیل مینماید.
ویژگیهای کلیدی Express:
- مدیریت سرور: Express کارهایی مانند ایجاد و مدیریت سرور را بهطور چشمگیری ساده میکند.
- مسیریابی آسان: این فریمورک ابزارهای قدرتمندی برای تعریف مسیرها و مدیریت درخواستها ارائه میدهد.
- انعطافپذیری بالا: با استفاده از Express، توسعهدهندگان میتوانند به راحتی برنامههای پیچیده و مقیاسپذیر ایجاد کنند.
- پشتیبانی از میانافزار (Middleware): اکسپرس امکان استفاده از میانافزارها را برای پردازش درخواستها و پاسخها فراهم میکند که این امر قابلیت توسعه و سفارشیسازی را افزایش میدهد.
- طراحی برنامههای وب چندمنظوره: Express ابزاری توانمند برای توسعه انواع برنامههای وب است. این فریمورک از طراحی برنامههای تکصفحهای (Single-page Applications) و چندصفحهای (Multi-page Applications) گرفته تا برنامههای ترکیبی، پشتیبانی میکند. انعطافپذیری بالای Express آن را برای پروژههایی با نیازهای متنوع مناسب میسازد.
- تعریف جدول مسیریابی
یکی از قابلیتهای برجسته Express، پشتیبانی جداول مسیریابی است. این ویژگی به توسعهدهندگان اجازه میدهد عملیاتهای مختلف را برای متدهای HTTP (مانند GET، POST، PUT و DELETE) و مسیرهای URL مشخص کنند. این ابزار ساده و قدرتمند، مسیریابی را به فرآیندی کارآمد و دقیق تبدیل میکند.
تصویر(10)
Express بهواسطه انعطافپذیری و سادگی خود، انتخاب اول بسیاری از توسعهدهندگان برای ایجاد برنامههای سریع و کارآمد در محیط Node.js است.
ادامه این مبحث را می توانید در قسمت سوم مطالعه نمایید.