آموزش Node.js: مفاهیم مقدماتی — بخش اول

۲۳۰ بازدید
آخرین به‌روزرسانی: ۱۸ شهریور ۱۴۰۲
زمان مطالعه: ۱۳ دقیقه
آموزش Node.js: مفاهیم مقدماتی — بخش اول

در این سری مقالات آموزش جامع Node.js با مفاهیم مقدماتی آشنا می‌شویم. Node.js یک محیط runtime سمت سرور جاوا اسکریپت است و روی سرور اجرا می‌شود. این محیط زمان اجرا، اوپن‌سورس و چند پلتفرمی است و از زمان معرفی در سال 2009 محبوبیت زیادی کسب و نقش مهمی در توسعه وب ایفا کرده است. اگر تعداد ستاره‌های گیت‌هاب را معیار محبوبیت بدانیم، Node.js با کسب بیش از 58 هزار ستاره، محبوبیت بالایی دارد.

آموزش جامع Node.js - مفاهیم مقدماتی

Node.js به اجرای موتور V8 جاوا اسکریپت می‌پردازد که هسته اصلی کروم را تشکیل می‌دهد و البته خارج از مرورگر قرار دارد. Node.js از توان مهندسانی که runtime جاوا اسکریپت کروم را چنین سریع ساخته‌اند بهره گرفته است (و می‌گیرد). این وضعیت به Node.js امکان داده است که بهبود عملکردی زیادی داشته باشد و از کامپایل درجا (Just-in-time) موتور V8 بهره بگیرد. به لطف این موقعیت، کدهای جاوا اسکریپت که روی Nose.js اجرا می‌شوند، عملکرد بسیار بالایی دارند.

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

هنگامی که Node.js نیاز به اجرای یک عملیات I/O مسدودکننده مانند خواندن مقداری از شبکه، دسترسی به پایگاه داده یا فایل‌سیستم داشته باشد، به جای مسدود کردن نخ، عملیات را هنگامی که پاسخ بازگشت یابد از سر می‌گیرد و بدین ترتیب زمان چرخه‌های CPU را به هدر نمی‌دهد.
بنابراین Node.js می‌تواند هزاران اتصال همزمان را روی تنها یک سرور و بدون نیاز به زحمت مدیریت همزمانی نخ‌ها اداره کند، چرا که همزمانی نخ‌ها می‌تواند موجب بروز باگ‌های زیادی شود.

مزیت منحصر به فرد Node.js

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

در Node.js می‌توان از استانداردهای جدید ECMAScript بدون مشکل استفاده کرد، چون لازم نیست منتظر بمانید که کاربران مرورگرهایشان را به‌روزرسانی کنند. شما می‌توانید با تغییر دادن نسخه Node.js، به سادگی از نسخه‌های مختلف ECMAScript استفاده کنید و همچنین با اجرای Node به همراه فلگ‌ها می‌توانید قابلیت‌های آزمایشی مختلفی را فعال کنید.

Node.js کتابخانه‌های زیادی دارد

ابزار مدیریت پکیج node به نام (npm) با ساختار ساده خود به شکوفایی اکوسیستم Node.js کمک زیادی کرده است. در حال حاضر رجیستری npm تقریباً 500،000 پکیج اوپن‌سورس را میزبانی می‌کند که می‌توان به صورت رایگان از آن‌ها استفاده کرد.

یک اپلیکیشن ساده Node.js

در ادامه کد برنامه کاملاً رایج Hello World را در Node.js مشاهده می‌کنید:

1const http = require('http')
2const hostname = '127.0.0.1'
3const port = 3000
4const server = http.createServer((req, res) => {
5  res.statusCode = 200
6  res.setHeader('Content-Type', 'text/plain')
7  res.end('Hello World\n')
8})
9server.listen(port, hostname, () => {
10  console.log(`Server running at http://${hostname}:${port}/`)
11})

برای اجرای این قطعه کد باید آن را به صورت فایلی با نام server.js ذخیره کنید و دستور node server.js را در ترمینال وارد نمایید.

  • در ابتدای این کد ماژول http مربوط به Node.js گنجانده شده است.
  • Node.js یک کتابخانه استاندارد جالب دارد که شامل پشتیبانی گسترده‌ای از شبکه‌بندی است.
  • متد ()createServer در ماژول http یک سرور HTTP جدید ایجاد کرده و آن را بازگشت می‌دهد.
  • سرور تنظیم شده است که به پورت و hostname خاصی گوش دهد. هنگامی که سرور آماده شود، تابع callback فراخوانی می‌شود و بدین ترتیب به ما اعلام می‌کند که سرور در حال اجرا است.
  • هر زمان که یک درخواست جدید دریافت شود، رویداد request فراخوانی می‌شود و دو شیء ارائه می‌شود که یکی درخواست (شیء http.IncomingMessage) و دیگری پاسخ (شیء http.ServerResponse) است.
  • این دو شیء برای مدیریت یک فراخوانی HTTP ضروری هستند.
  • شیء نخست جزییات درخواست را شامل می‌شود. در این مثال ساده از این شیء استفاده نشده است؛ اما می‌توانید به هدرهای درخواست و داده‌های آن دسترسی داشته باشید.
  • شیء دوم برای بازگرداندن داده‌ها به فراخواننده استفاده می‌شود. در این مورد:
1res.statusCode = 200
  • ما مقدار مشخصه statusCode را برابر با 200 تعیین می‌کنیم تا نشان دهیم که پاسخ موفقی بوده است. هدر Content-Type را به صورت زیر تنظیم می‌کنیم:
1res.setHeader('Content-Type', 'text/plain')
  • و پاسخ را بسته و محتوا را به صورت یک آرگومان به ()end اضافه می‌کنیم:
1res.end('Hello World\n')

مفاهیم مقدماتی Node.js

فریمورک و ابزارهای Node.js

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

Express: یکی از ساده‌ترین و با این حال قدرتمندترین روش‌های ایجاد وب‌سرور است. رویکرد مینیمالیستی آن و تمرکز صرف روی قابلیت‌های اساسی یک سرور، کلید موفقیتش بوده است.

Meteor: یک فریمورک فول‌استک قدرتمند است که یک رویکرد ایزومورفیک برای ساخت اپلیکیشن‌ها با جاوا اسکریپت فراهم می‌کند و می‌توان این کد را در هر دو سمت سرور و کلاینت استفاده کرد. این فریمورک زمانی به عنوان یک ابزار سرهم‌بندی‌شده شناخته می‌شد که همه چیز را عرضه می‌کرد؛ اما امروز با کتابخانه‌های فرانت‌اند مانند React، Vue و Angular ادغام شده است. Meteor می‌تواند برای ایجاد اپلیکیشن‌های موبایل نیز استفاده شود.

Koa: این ابزار از سوی همان تیم سازنده Express ارائه شده است و هدف آن ساده‌تر و کوچک‌تر ساختن کارها بر مبنای تجربیات سالیان بوده است. این پروژه جدید بر اساس نیاز به ایجاد تغییراتی که سازگار نیستند و با هدف از دست ندادن جامعه کنونی متولد شده است.

Next.js: یک فریمورک برای اجرای اپلیکیشن‌های رندر شده React در سمت سرور است.

Micro: یک سرور بسیار سبک برای ایجاد میکروسرویس های ناهمگام HTTP است.

Socket.io: یک موتور ارتباطی همزمان برای ساخت اپلیکیشن‌های شبکه است.

تاریخچه مختصر Node.js

در این بخش به بررسی تاریخچه Node.js از زمان ارائه در سال 2009 تا به اکنون می‌پردازیم. باور کنید یا نه Node.js امروز 10 ساله است. اگر بخواهیم مقایسه کنیم، جاوا اسکریپت هم اینک 24 ساله است و وب آن چنان که می‌شناسیم (پس از معرفی مرورگر Mosaic) سنی برابر با 25 سال دارد.

9 سال برای عمر یک فناوری عدد بسیار کوچکی محسوب می‌شود؛ اما به نظر می‌رسد که Node.js مدت‌های زیادی است که با ما همراه بوده است. در این بخش تلاش می‌کنیم تصویری بزرگ از Node.js و تاریخچه آن ارائه کنیم و چشم‌انداز موضوع را روشن سازیم.

اندکی از تاریخچه

جاوا اسکریپت یک زبان برنامه‌نویسی است که به عنوان ابزار اسکریپت‌نویسی در Netscape برای دستکاری صفحه‌های وب درون مرورگر آن‌ها به نام Netscape Navigator ابداع شد.

بخشی از مدل درآمدی Netscape فروش وب‌سرور بود که محیطی به نام Netscape LiveWire داشت و در آن امکان ایجاد صفحه‌های دینامیک با استفاده از جاوا اسکریپت سمت سرور وجود داشت. بنابراین ایده جاوا اسکریپت سمت سرور از سوی Node.js معرفی نشده است و قدمتی دست‌کم به اندازه خود جاوا اسکریپت دارد؛ هر چند در آن زمان موفق نبود.

یکی از عوامل کلیدی که منجر به موفقیت Node.js شد، بحث زمان‌بندی بود. در زمان عرضه Node.js چند سالی بود که جاوا اسکریپت به لطف اپلیکیشن‌های web 2.0 به عنوان یک زبان جدی مطرح شده بود و به دنیا نشان داده بود که تجربه وب مدرن (مانند سرویس نقشه گوگل یا Gmail) به چه شکل می‌تواند باشد.

عملکرد موتورهای جاوا اسکریپت به لطف نبرد کامپایل مرورگرها که همچنان با شدت در جریان است، به میزان زیادی بهبود یافت. تیم‌های توسعه‌ای که دست‌اندرکار توسعه مرورگرهای اصلی بودند هر روز به شدت تلاش می‌کردند تا عملکرد بهتری ارائه کنند و بدین ترتیب جاوا اسکریپت به عنوان یک پلتفرم کاملاً تثبیت شد. V8 ، موتوری است که جاوا اسکریپت در پشت‌صحنه از آن استفاده می‌کند و یکی از ده‌ها موتور پردازش جاوا اسکریپت است که در مرورگر کروم نیز مورد استفاده قرار می‌گیرد.

اما البته به این نکته نیز باید اشاره کنیم که Node.js صرفاً به دلیل خوش‌شانسی یا زمان‌بندی خاص خود موفق نشده است. Node.js یکی از خلاقانه‌ترین روش‌ها برای برنامه‌نویسی جاوا اسکریپت در سمت سرور را نیز ارائه کرده است.

چگونه Node.js را نصب کنیم؟

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

Node.js می‌تواند به چند روش نصب شود. در این مبحث رایج‌ترین و راحت‌ترین روش‌ها را معرفی می‌کنیم. پکیج‌های رسمی برای هر چهار پلتفرم عمده از این صفحه (+) قابل دانلود هستند. یک روش بسیار آسان برای نصب Node.js از طریق ابزار مدیریت بسته است. در این حالت هر سیستم عاملی می‌تواند نسخه خاص خود را داشته باشد.

روی macOS می‌توان از Homebrew که یک استاندارد غیررسمی است استفاده کرد و هنگامی که نصب شد امکان نصب Node.js را به روشی کاملاً آسان با اجرای دستور زیر در CLI ارائه می‌کند:

brew install node

ابزارهای دیگر مدیریت بسته برای لینوکس و ویندوز در این صفحه (+) فهرست‌بندی شده‌اند. nvm یک روش راحت برای اجرای Node.js محسوب می‌شود که امکان سوئیچ آسان بین نسخه‌های Node.js و نصب نسخه‌های جدید برای امتحان کردن و حذف نسخه‌ها در صورت ناموفق بودن را می‌دهد.

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

برای استفاده از Node.js چقدر باید جاوا اسکریپت بدانیم؟

اگر به تازگی با جاوا اسکریپت آشنا شده‌اید، فکر می‌کنید تا چه سطحی باید با این زبان آشنا شوید؟ به عنوان یک مبتدی، رسیدن به نقطه‌ای که فرد از مهارت‌های برنامه‌نویسی خود مطمئن باشد، کار دشواری محسوب می‌شود. همچنین در زمان یادگیری این زبان ممکن است کنجکاو باشید که جاوا اسکریپت کجا خاتمه می‌یابد و Node از کجا آغاز می‌شود.

پیشنهاد می‌کنیم پیش از ورود به Node.js درک نسبتاً خوبی از مفاهیم اصلی جاوا اسکریپت کسب کنید که شامل سرفصل‌های زیر می‌شود:

  • ساختار واژگانی
  • عبارت‌ها
  • نوع‌ها
  • متغیرها
  • تابع‌ها
  • This
  • تابع‌های Arrow
  • حلقه‌ها
  • حلقه‌ها و دامنه‌ها
  • آرایه‌ها
  • قالب‌های لفظی (Template Literals)
  • نقطه‌ویرگول‌ها
  • حالت Strict
  • و ECMAScript 6, 2016, 2017

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

مفاهیم زیر نیز برای درک برنامه‌نویسی ناهمگام که بخشی اساسی از Node.js محسوب می‌شود، ضروری هستند:

  • برنامه‌نویسی ناهمگام و callback-ها
  • تایمرها
  • Promise-ها
  • Async و Await
  • بستارها (Closures)
  • حلقه Event

تفاوت‌های بین Node.js و مرورگر

روش نوشتن اپلیکیشن‌های جاوا اسکریپت در Node.js متفاوت از برنامه‌نویسی برای وب درون مرورگر است. البته هر دو نسخه مرورگر و Node از جاوا اسکریپت به عنوان زبان برنامه‌نویسی استفاده می‌کنند؛ اما ساخت اپلیکیشن‌هایی که در مرورگر اجرا شوند کاملاً متفاوت از ساخت اپلیکیشن‌های Node.js است.

علی‌رغم این واقعیت که در هر دو مورد از کد جاوا اسکریپت استفاده می‌شود، برخی تفاوت‌های کلیدی وجود دارند که ممکن است باعث شوند تجربه شما از این دو به میزان زیادی متفاوت باشد.

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

کد جاوا اسکریپت در مرورگر

در مرورگر اغلب زمان ما به تعامل با DOM یا دیگر API-های پلتفرم وب مانند cookie-ها سپری می‌شود؛ اما این موارد در Node.js وجود ندارند. در سمت سرور نیازی به کار با document و window یا اشیای دیگری که از سوی مرورگر ارائه می‌شوند ندارید.

همچنین در مرورگر همه آن API-های زیبایی که Node.js از طریق ماژول‌هایش ارائه می‌کند، مانند کارکرد دسترسی به فایل سیستم را در اختیار نداریم.

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

این بدان معنی است که می‌توانید هر نوع کدهای جاوا اسکریپت مدرن ES6-8-9 که نسخه Node شما پشتیبانی می‌کند، بنویسید.

جاوا اسکریپت به سرعت حرکت می‌کند، اما مرورگرها کندتر رشد می‌کنند و کاربران نیز با آهنگ کندتری ارتقا می‌یابند. از این رو در مواردی شاهد هستیم که برخی افراد از نسخه‌های قدیمی‌تر JavaScript/ECMAScript استفاده می‌کنند.

البته می‌توان پیش از ارسال کد به مرورگر از Babel برای ترجمه کد به نسخه سازگار با ES5 استفاده کرد؛ اما در Node.js نیازی به این کار وجود ندارد. تفاوت مهم دیگر این است که Node.js از سیستم ماژول CommonJS استفاده می‌کند؛ در حالی که در مرورگر مدت زیادی از پیاده‌سازی استاندارد ماژول‌های ES نمی‌گذرد.

این وضعیت در عمل بدان معنی است که وقتی در Node.js از ()require استفاده می‌کنید در مرورگر همچنان از import استفاده خواهد شد.

موتور V8 جاوا اسکریپت

V8 نام موتور جاوا اسکریپت است که در مرورگر کروم تعبیه شده است. این همان موتوری است که کد جاوا اسکریپت ما را دریافت کرده و آن را در مرورگرهای کروم کاربران اجرا می‌کند.

V8 محیط runtime-ی را عرضه می‌کند که کدهای جاوا اسکریپت درون آن اجرا می‌شوند. DOM و دیگر API-های پلتفرم وب از سوی مرورگر عرضه می‌شوند.

نکته جالب این است که موتور جاوا اسکریپت مستقل از مرورگری است که آن را میزبانی می‌کند. این قابلیت کلیدی امکان ظهور Node.js را فراهم ساخته است. V8 در سال 2009 به عنوان موتور Node.js انتخاب شده است و از آنجا که Node.js محبوبیت بسیار بالایی کسب کرده است V8 نیز به موتوری تبدیل شده است که کدهای سمت سرور زیادی را اجرا می‌کند که به زبان جاوا اسکریپت نوشته شده‌اند.

اکوسیستم Node.js بزرگ است و به لطف آن، V8 برای عرضه اپلیکیشن‌های دسکتاپ با استفاده از پروژه‌هایی مانند Electron نیز به خدمت گرفته شده است.

موتورهای دیگر جاوا اسکریپت

مرورگرهای دیگر نیز موتورهای خاص خود را برای جاوا اسکریپت دارند که به شرح زیر هستند:

  • فایرفاکس از Spidermonkey استفاده می‌کند.
  • سافاری از JavaScriptCore استفاده می‌کند که Nitro نیز نامیده می‌شود.
  • Edge از Chakra استفاده می‌کند.

موارد زیاد دیگری نیز وجود دارند. همه این موتورها استاندارد ECMA ES-262 را پیاده‌سازی می‌کنند که ECMAScript نیز نامیده می‌شود و استاندارد مورد استفاده جاوا اسکریپت است.

در جستجوی عملکرد

V8 به زبان ++C نوشته شده است و به طور مکرر بهبود یافته است. این موتور پرتابل است و روی مک، ویندوز، لینوکس و چند سیستم عامل دیگر اجرا می‌شود. ما در بخش معرفی V8 برخی از جزییات پیاده‌سازی آن را معرفی نکردیم. این موارد را می‌توانید در سایت رسمی V8 (+) مشاهده کنید که در طی زمان تغییر می‌یابند و تغییراتی غالباً بسیار عمیق هستند.

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

کامپایل

جاوا اسکریپت عموماً به عنوان یک زبان تفسیری نگریسته می‌شود، اما موتورهای جاوا اسکریپت مدرن دیگر کدهای جاوا اسکریپت را تفسیر نمی‌کنند، بلکه آن را کامپایل می‌کنند. این اتفاق از سال 2009 به این سو و با اضافه شدن کامپایلر SpiderMonkey به مرورگر فایرفاکس نسخه 3.5 رخ داد و سپس دیگر رقبا نیز این مسیر را پیگیری کردند.

جاوا اسکریپت به صورت درونی به وسیله V8 و با روش درجا (JIT) کامپایل می‌شود تا سرعت اجرای کد افزایش یابد.

این وضعیت ممکن است به نظر غیرمنطقی بیاید؛ اما از زمان معرفی Google Maps در سال 2004، جاوا اسکریپت از زبانی که عموماً چند خط کد را اجرا می‌کرد، به زبانی تبدیل شده است که هزاران و بلکه صدها هزار خط کد را در مرورگر اجرا می‌کند.

اپلیکیشن‌های امروزین ما می‌توانند به مدت صدها ساعت درون مرورگرها اجرا شوند و تفاوت زیادی با آن زمانی دارند که تنها چند قاعده اعتبارسنجی فرم یا اسکریپت ساده بودند.

در این دنیای جدید، کامپایل کردن کدهای جاوا اسکریپت کاری کاملاً معنی‌دار است، زیرا گرچه ممکن است مدت بیشتری طول بکشد که کد جاوا اسکریپت آماده اجرا شود؛ اما وقتی آماده شد، عملکرد بسیار بالاتری نسبت به کد تفسیری ارائه می‌کند.

چگونه از یک برنامه Node.js خارج شویم؟

روش‌های مختلفی برای خاتمه بخشیدن به یک اپلیکیشن Node.js وجود دارد. هنگامی که یک برنامه را در کنسول اجرا می‌کنید، می‌توانید آن را با ctrl-C ببندید؛ اما منظور ما در این بخش خروج برنامه‌نویسی شده از برنامه است.

برای توضیح این روش ابتدا از بدترین راه‌حل آغاز می‌کنیم و دلیل این که نباید از آن استفاده کنید را توضیح می‌دهیم. ماژول مرکزی process یک روش کارآمد به صورت زیر ارائه کرده است که امکان خروج برنامه‌نویسی شده از برنامه Node.js را ارائه می‌کند:

1process.exit()

هنگامی که Node.js این خط را اجرا می‌کند، پردازش مربوطه بی‌درنگ مجبور به خروج می‌شود.

این بدان معنی است که هر callback که در حالت انتظار باشد، هر درخواست شبکه که همچنان در حال ارسال باشد، هر دسترسی به فایل سیستم، یا پردازش‌هایی که در stdout یا stderr  نوشته می‌شدند، بی‌درنگ و بدون هیچ ملاحظه‌ای خاتمه می‌یابند.

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

1process.exit(1)

کد خروج به صورت پیش‌فرض 0 است که به معنی موفقیت است.

معنی کدهای خروجی مختلف

کدهای خروجی مختلف معناهای متفاوتی دارند که می‌توانید در سیستم خود استفاده کنید تا برنامه را وادار به تعامل با برنامه‌های دیگر بکنید. همچنین می‌توانید مشخصه process.exitCode را نیز تعیین کنید:

1process.exitCode = 1

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

در اغلب موارد ما در Node.js سرورهایی مانند سرور HTTP زیر را آغاز می‌کنیم:

1const express = require('express')
2const app = express()
3app.get('/', (req, res) => {
4  res.send('Hi!')
5})
6app.listen(3000, () => console.log('Server ready'))

این برنامه هرگز به پایان نمی‌رسد. اگر ()process.exit را فراخوانی کنید؛ هر درخواستی که هم اینک در حالت انتظار یا اجرا باشد، خارج می‌شود. این وضعیت مناسبی نیست.

در این حالت، باید یک دستور مبنی بر سیگنال SIGTERM ارسال کنید و آن را با استفاده از دستگیره سیگنال پردازش مدیریت کنید.

نکته: process نیازمند require نیست و به صورت خودکار ارائه می‌شود.

1const express = require('express')
2const app = express()
3app.get('/', (req, res) => {
4  res.send('Hi!')
5})
6app.listen(3000, () => console.log('Server ready'))
7process.on('SIGTERM', () => {
8  app.close(() => {
9    console.log('Process terminated')
10  })
11})

سیگنال‌ها چه هستند؟ سیگنال‌ها سیستم ارتباط داخلی اینترفیس سیستم عامل پرتابل (POSIX) هستند. در واقع سیگنال یک اعلان است که به یک پردازش ارسال می‌شود تا به آن اطلاع دهد که رویدادی رخ داده است.

  • SIGKILL سیگنالی است که به پردازش اعلام می‌کند تا بی‌درنگ خاتمه یابد و معمولاً عملکردی شبیه به ()process.exit دارد.
  • SITERM سیگنالی است که به پردازش اعلام می‌کند تا پردازش را با ملایمت خاتمه ببخشد. این سیگنال از سوی مدیریت‌های پردازش مانند upstart یا supervisord و موارد مشابه ارسال می‌شود.

این سیگنال را می‌توان از درون برنامه در تابع دیگری نیز ارسال کرد:

1process.kill(process.pid, 'SIGTERM')

همچنین امکان ارسال این سیگنال از یک برنامه اجرایی دیگر Node.js یا از اپلیکیشن اجرایی دیگری در سیستم وجود دارد. در این مورد آخر آن اپلیکیشن باید PID پردازشی که قرار است خاتمه یابد را بداند.

شیوه خواندن متغیرهای محیطی در Node.js

ماژول مرکزی process در Node مشخصه env را ارائه می‌کند که میزبان همه متغیرهایی است که در لحظه آغاز به کارِ پردازش تنظیم شده باشند. در ادامه مثالی را مشاهده می‌کنید که به متغیر محیطی NODE_ENV دسترسی می‌یابد و به صورت پیش‌فرض برابر با development تنظیم شده است.

1process.env.NODE_ENV // "development"

تعیین آن به صورت production پیش از اجرای اسکریپت به Node.js اعلام می‌کند که این محیط یک محیط «توزیع نهایی» (production) است. به همین ترتیب می‌توانید به هر متغیر سفارشی محیطی که تنظیم کرده‌اید نیز دسترسی داشته باشید.

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

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
freecodecamp
۱ دیدگاه برای «آموزش Node.js: مفاهیم مقدماتی — بخش اول»

سلام آقای لطفی عزیز
وقتتون بخیر
مقاله هاتون خیلی عالیه.
واقعا ممونم.
میخواستم ببینم راه ارتباطی با شما چیه؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *