مقدمه
Node.js یک محیط زمان اجرا منبع باز محبوب است که می تواند جاوا اسکریپت را در خارج از مرورگر با استفاده از موتور جاوا اسکریپت V8، که همان موتوری است که برای اجرای جاوا اسکریپت مرورگر وب گوگل کروم استفاده می شود، اجرا کند. Node Runtime معمولا برای ایجاد ابزارهای خط فرمان و سرورهای وب استفاده می شود.
یادگیری Node.js به شما این امکان را میدهد که کد فرانتاند و کد بکاند خود را به یک زبان بنویسید. استفاده از جاوا اسکریپت در کل پشته میتواند به کاهش زمان برای تغییر زمینه کمک کند و کتابخانهها راحتتر بین سرور بکاند و پروژههای فرانتاند شما به اشتراک گذاشته میشوند.
همچنین، به لطف پشتیبانی از اجرای ناهمزمان، Node.js در کارهای فشرده ورودی/خروجی برتری دارد، که آن را برای وب بسیار مناسب میکند. برنامههای بیدرنگ، مانند پخش ویدیو یا برنامههایی که به طور مداوم دادهها را ارسال و دریافت میکنند، وقتی در Node.js نوشته میشوند، میتوانند کارآمدتر اجرا شوند.
در این آموزش شما اولین برنامه خود را با زمان اجرا Node.js ایجاد خواهید کرد. شما با چند مفهوم خاص Node آشنا می شوید و راه خود را برای ایجاد برنامه ای ایجاد می کنید که به کاربران کمک می کند تا متغیرهای محیطی سیستم خود را بررسی کنند. برای انجام این کار، نحوه خروجی رشته ها به کنسول، دریافت ورودی از کاربر و دسترسی به متغیرهای محیط را یاد خواهید گرفت.
پیش نیازها
برای تکمیل این آموزش، شما نیاز دارید:
- Node.js روی دستگاه توسعه شما نصب شده است. این آموزش از Node.js نسخه 10.16.0 استفاده می کند. برای نصب آن در macOS یا اوبونتو 18.04، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا بخش «نصب با استفاده از PPA» از نحوه نصب Node.js در اوبونتو 18.04 را دنبال کنید.
- دانش اولیه جاوا اسکریپت که می توانید در اینجا بیابید: نحوه کدنویسی در جاوا اسکریپت.
مرحله 1 – خروجی به کنسول
برای نوشتن یک “سلام، جهان!” برنامه، یک ویرایشگر متن خط فرمان مانند nano را باز کنید و یک فایل جدید ایجاد کنید:
nano hello.js
با باز شدن ویرایشگر متن، کد زیر را وارد کنید:
console.log("Hello World");
شی کنسول در Node.js روشهای سادهای را برای نوشتن در stdout، stderr یا هر جریان Node.js دیگری ارائه میکند که در بیشتر موارد خط فرمان است. روش log در جریان stdout چاپ میشود، بنابراین میتوانید آن را در کنسول خود ببینید.
در زمینه Node.js، جریان ها اشیایی هستند که می توانند داده ها را دریافت کنند، مانند جریان stdout، یا اشیایی که می توانند داده ها را خروجی بگیرند، مانند سوکت شبکه یا یک فایل. در مورد استریم های stdout و stderr، هر داده ای که به آنها ارسال می شود در کنسول نشان داده می شود. یکی از نکات مهم در مورد استریم ها این است که به راحتی هدایت می شوند، در این صورت می توانید خروجی برنامه خود را به عنوان مثال به یک فایل هدایت کنید.
با فشردن CTRL+X نانو را ذخیره کرده و از آن خارج شوید، وقتی از شما خواسته شد فایل را ذخیره کنید، Y را فشار دهید. اکنون برنامه شما آماده اجرا است.
مرحله 2 – اجرای برنامه
برای اجرای این برنامه از دستور node به صورت زیر استفاده کنید:
node hello.js
برنامه hello.js خروجی زیر را اجرا و نمایش می دهد:
Output
Hello World
مفسر Node.js فایل را خواند و console.log (“Hello World”) را اجرا کرد. با فراخوانی متد log شیء جهانی کنسول. رشته “Hello World” به عنوان آرگومان به تابع log ارسال شد.
اگرچه برای نشان دادن اینکه متن یک رشته است، علامت نقل قول در کد ضروری است، اما روی صفحه چاپ نمی شود.
با تأیید اینکه برنامه کار می کند، بیایید آن را تعاملی تر کنیم.
مرحله 3 – دریافت ورودی کاربر از طریق آرگومان های خط فرمان
هر بار که Node.js “Hello, World!” را اجرا می کنید. برنامه، همان خروجی را تولید می کند. برای اینکه برنامه را پویاتر کنیم، اجازه دهید از کاربر ورودی دریافت کرده و آن را روی صفحه نمایش دهیم.
ابزارهای خط فرمان اغلب آرگومان های مختلفی را می پذیرند که رفتار آنها را تغییر می دهد. به عنوان مثال، اجرای گره با آرگومان –version به جای اجرای مفسر، نسخه نصب شده را چاپ می کند. در این مرحله، کد خود را از طریق آرگومان های خط فرمان پذیرفته اید.
یک فایل arguments.js جدید با nano ایجاد کنید:
nano arguments.js
کد زیر را وارد کنید:
console.log(process.argv);
شی فرآیند یک شی جهانی Node.js است که حاوی توابع و داده هایی است که همه مربوط به فرآیند در حال اجرا Node.js هستند. خاصیت argv آرایه ای از رشته ها است که شامل تمام آرگومان های خط فرمان داده شده به یک برنامه است.
با تایپ CTRL+X، نانو را ذخیره کرده و از آن خارج شوید، زمانی که از شما خواسته شد فایل را ذخیره کنید، Y را فشار دهید.
حالا وقتی این برنامه را اجرا می کنید، یک آرگومان خط فرمان مانند این ارائه می دهید:
node arguments.js hello world
خروجی به شکل زیر است:
Output
[ '/usr/bin/node',
'/home/sammy/first-program/arguments.js',
'hello',
'world' ]
اولین آرگومان در آرایه process.argv همیشه محل باینری Node.js است که برنامه را اجرا می کند. آرگومان دوم همیشه محل فایل در حال اجرا است. آرگومان های باقی مانده همان چیزی است که کاربر وارد کرده است، در این مورد: سلام و دنیا.
ما بیشتر علاقه مند به آرگومان هایی هستیم که کاربر وارد کرده است، نه آرگومان های پیش فرضی که Node.js ارائه می کند. فایل arguments.js را برای ویرایش باز کنید:
nano arguments.js
تغییر console.log(process.arg)؛ به موارد زیر:
console.log(process.argv.slice(2));
از آنجایی که argv یک آرایه است، میتوانید از روش برش داخلی جاوا اسکریپت استفاده کنید که مجموعهای از عناصر را برمیگرداند. وقتی تابع slice را با 2 به عنوان آرگومان ارائه می کنید، تمام عناصر argv را که بعد از عنصر دوم آن قرار می گیرد، دریافت می کنید. یعنی آرگومان هایی که کاربر وارد کرده است.
برنامه را با دستور node و همان آرگومان های دفعه قبل دوباره اجرا کنید:
node arguments.js hello world
حال، خروجی به صورت زیر است:
Output
[ 'hello', 'world' ]
اکنون که می توانید ورودی را از کاربر جمع آوری کنید، بیایید ورودی های محیط برنامه را جمع آوری کنیم.
مرحله 4 – دسترسی به متغیرهای محیطی
متغیرهای محیطی، دادههای کلید-مقدار هستند که خارج از یک برنامه ذخیره میشوند و توسط سیستمعامل ارائه میشوند. آنها معمولاً توسط سیستم یا کاربر تنظیم می شوند و برای تمام فرآیندهای در حال اجرا برای اهداف پیکربندی یا حالت در دسترس هستند. برای دسترسی به آنها می توانید از شی فرآیند Node استفاده کنید.
از nano برای ایجاد یک فایل محیطی جدید استفاده کنید.
nano environment.js
کد زیر را اضافه کنید:
console.log(process.env);
شیء env تمام متغیرهای محیطی را که هنگام اجرای برنامه Node.js در دسترس هستند ذخیره می کند.
ذخیره کنید و مانند قبل خارج شوید و با دستور node فایل محیطی.js را اجرا کنید.
node environment.js
پس از اجرای برنامه، باید خروجی مشابه زیر را مشاهده کنید:
Output
{ SHELL: '/bin/bash',
SESSION_MANAGER:
'local/digitalocean:@/tmp/.ICE-unix/1003,unix/digitalocean:/tmp/.ICE-unix/1003',
COLORTERM: 'truecolor',
SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh',
XMODIFIERS: '@im=ibus',
DESKTOP_SESSION: 'ubuntu',
SSH_AGENT_PID: '1150',
PWD: '/home/sammy/first-program',
LOGNAME: 'sammy',
GPG_AGENT_INFO: '/run/user/1000/gnupg/S.gpg-agent:0:1',
GJS_DEBUG_TOPICS: 'JS ERROR;JS LOG',
WINDOWPATH: '2',
HOME: '/home/sammy',
USERNAME: 'sammy',
IM_CONFIG_PHASE: '2',
LANG: 'en_US.UTF-8',
VTE_VERSION: '5601',
CLUTTER_IM_MODULE: 'xim',
GJS_DEBUG_OUTPUT: 'stderr',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
TERM: 'xterm-256color',
LESSOPEN: '| /usr/bin/lesspipe %s',
USER: 'sammy',
DISPLAY: ':0',
SHLVL: '1',
PATH:
'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
DBUS_SESSION_BUS_ADDRESS: 'unix:path=/run/user/1000/bus',
_: '/usr/bin/node',
OLDPWD: '/home/sammy' }
به خاطر داشته باشید که بسیاری از متغیرهای محیطی که مشاهده می کنید به پیکربندی و تنظیمات سیستم شما وابسته هستند و خروجی شما ممکن است به طور قابل ملاحظه ای متفاوت از آنچه در اینجا می بینید به نظر برسد. به جای مشاهده یک لیست طولانی از متغیرهای محیطی، ممکن است بخواهید یک مورد خاص را بازیابی کنید.
مرحله 5 – دسترسی به یک متغیر محیطی مشخص
در این مرحله شما متغیرهای محیطی و مقادیر آنها را با استفاده از شی global process.env مشاهده کرده و مقادیر آنها را در کنسول چاپ خواهید کرد.
شی process.env یک نگاشت ساده بین نام متغیرهای محیطی و مقادیر آنهاست که به صورت رشته ذخیره می شود. مانند همه اشیاء در جاوا اسکریپت، شما با ارجاع به نام آن در پرانتز به یک ویژگی دسترسی دارید.
فایل محیطی.js را برای ویرایش باز کنید:
nano environment.js
تغییر console.log(process.env)؛ به:
console.log(process.env["HOME"]);
پرونده را ذخیره کرده و خارج شوید. حالا برنامه محیط زیست.js را اجرا کنید:
node environment.js
اکنون خروجی به شکل زیر است:
Output /home/sammy
به جای چاپ کل شی، اکنون فقط ویژگی HOME process.env را چاپ می کنید که مقدار متغیر محیطی $HOME را ذخیره می کند.
باز هم به خاطر داشته باشید که خروجی این کد احتمالاً با آنچه در اینجا می بینید متفاوت خواهد بود زیرا مختص سیستم شماست. اکنون که میتوانید متغیر محیطی را برای بازیابی مشخص کنید، میتوانید برنامه خود را با درخواست از کاربر برای متغیری که میخواهد ببیند، ارتقا دهید.
مرحله 6 – بازیابی یک آرگومان در پاسخ به ورودی کاربر
در مرحله بعد، از توانایی خواندن آرگومان های خط فرمان و متغیرهای محیطی برای ایجاد یک ابزار خط فرمان که مقدار یک متغیر محیطی را روی صفحه چاپ می کند، استفاده خواهید کرد.
از nano برای ایجاد یک فایل جدید echo.js استفاده کنید:
nano echo.js
کد زیر را اضافه کنید:
const args = process.argv.slice(2);
console.log(process.env[args[0]]);
خط اول echo.js تمام آرگومان های خط فرمان را که کاربر ارائه کرده است در یک متغیر ثابت به نام args ذخیره می کند. خط دوم متغیر محیطی ذخیره شده در اولین عنصر args را چاپ می کند. یعنی اولین آرگومان خط فرمان که کاربر ارائه کرده است.
نانو را ذخیره کرده و از آن خارج شوید، سپس برنامه را به صورت زیر اجرا کنید:
node echo.js HOME
حال خروجی این خواهد بود:
Output
/home/sammy
آرگومان HOME در آرایه args ذخیره شد، که سپس برای یافتن مقدار آن در محیط از طریق شی process.env استفاده شد.
در این مرحله اکنون می توانید به مقدار هر متغیر محیطی در سیستم خود دسترسی داشته باشید. برای تأیید این موضوع، متغیرهای زیر را مشاهده کنید: PWD، USER، PATH.
بازیابی متغیرهای منفرد خوب است، اما اجازه دادن به کاربر برای تعیین تعداد متغیرهای مورد نظر بهتر است.
مرحله 7 – مشاهده متغیرهای محیطی متعدد
در حال حاضر، برنامه تنها می تواند یک متغیر محیطی را در یک زمان بررسی کند. اگر بتوانیم چندین آرگومان خط فرمان را بپذیریم و مقدار متناظر آنها را در محیط بدست آوریم مفید خواهد بود. از nano برای ویرایش echo.js استفاده کنید:
nano echo.js
فایل را طوری ویرایش کنید که به جای آن کد زیر را داشته باشد:
const args = process.argv.slice(2);
args.forEach(arg => {
console.log(process.env[arg]);
});
متد forEach یک متد استاندارد جاوا اسکریپت بر روی تمام اشیاء آرایه است. تابع فراخوانی را میپذیرد که در هنگام تکرار روی هر عنصر آرایه استفاده میشود. شما از forEach در آرایه args استفاده میکنید و یک تابع فراخوانی برای آن ارائه میکنید که مقدار آرگومان فعلی را در محیط چاپ میکند.
فایل را ذخیره کرده و از آن خارج شوید. حالا برنامه را با دو آرگومان دوباره اجرا کنید:
node echo.js HOME PWD
خروجی زیر را خواهید دید:
[secondary_label Output]
/home/sammy
/home/sammy/first-program
تابع forEach تضمین می کند که هر آرگومان خط فرمان در آرایه args چاپ شده است.
اکنون شما راهی برای بازیابی متغیرهایی که کاربر درخواست می کند دارید، اما هنوز باید مواردی را که کاربر داده های بدی را وارد می کند رسیدگی کنیم.
مرحله 8 – مدیریت ورودی نامشخص
برای اینکه ببینید اگر به برنامه آرگومانی بدهید که یک متغیر محیطی معتبر نیست چه اتفاقی میافتد، موارد زیر را اجرا کنید:
node echo.js HOME PWD NOT_DEFINED
خروجی مشابه شکل زیر خواهد بود:
[secondary_label Output]
/home/sammy
/home/sammy/first-program
undefined
دو خط اول همانطور که انتظار می رود چاپ می شود و خط آخر فقط تعریف نشده است. در جاوا اسکریپت، یک مقدار تعریف نشده به این معنی است که به یک متغیر یا ویژگی مقداری اختصاص داده نشده است. از آنجایی که NOT_DEFINED یک متغیر محیطی معتبر نیست، به صورت تعریف نشده نشان داده می شود.
اگر کاربر آرگومان خط فرمان او در محیط یافت نشد، دیدن پیام خطا برای کاربر مفیدتر خواهد بود.
echo.js را برای ویرایش باز کنید:
nano echo.js
echo.js را طوری ویرایش کنید که کد زیر را داشته باشد:
const args = process.argv.slice(2);
args.forEach(arg => {
let envVar = process.env[arg];
if (envVar === undefined) {
console.error(`Could not find "${arg}" in environment`);
} else {
console.log(envVar);
}
});
در اینجا، تابع callback ارائه شده به forEach را برای انجام کارهای زیر تغییر داده اید:
- مقدار آرگومان های خط فرمان را در محیط دریافت کنید و آن را در یک متغیر env Var ذخیره کنید.
- بررسی کنید که آیا مقدار envVar تعریف نشده است یا خیر.
- اگر envVar تعریف نشده باشد، یک پیام مفید چاپ می کنیم که نشان می دهد یافت نشد.
- اگر متغیر محیطی پیدا شد، مقدار آن را چاپ می کنیم.
حالا یک بار دیگر دستور زیر را اجرا کنید:
node echo.js HOME PWD NOT_DEFINED
این بار خروجی این خواهد بود:
[secondary_label Output]
/home/sammy
/home/sammy/first-program
Could not find "NOT_DEFINED" in environment
اکنون وقتی یک آرگومان خط فرمان ارائه میکنید که یک متغیر محیطی نیست، یک پیام خطای واضح دریافت میکنید که این را بیان میکند.
نتیجه
اولین برنامه شما “Hello World” را روی صفحه نمایش داد و اکنون یک ابزار خط فرمان Node.js نوشته اید که آرگومان های کاربر را برای نمایش متغیرهای محیطی می خواند.
اگر می خواهید این کار را بیشتر انجام دهید، می توانید رفتار این برنامه را حتی بیشتر تغییر دهید. به عنوان مثال، ممکن است بخواهید قبل از چاپ، آرگومان های خط فرمان را تأیید کنید. اگر یک آرگومان تعریف نشده باشد، می توانید یک خطا را برگردانید و کاربر تنها در صورتی خروجی دریافت می کند که همه آرگومان ها متغیرهای محیطی معتبر باشند.