مقدمة
Node.js هي بيئة تشغيل مفتوحة المصدر شائعة الاستخدام، تُمكّن من تنفيذ جافا سكريبت خارج المتصفح باستخدام محرك جافا سكريبت V8، وهو نفس المحرك المستخدم لتنفيذ جافا سكريبت في متصفح جوجل كروم. تُستخدم Node Runtime عادةً لإنشاء أدوات سطر الأوامر وخوادم الويب.
يتيح لك تعلم Node.js كتابة شيفرتك البرمجية الأمامية والخلفية بنفس اللغة. كما أن استخدام JavaScript في جميع مراحل التطوير يُقلل من وقت تبديل السياق، ويُسهّل مشاركة المكتبات بين خادمك الخلفي ومشاريعك الأمامية.
بفضل دعمه للتنفيذ غير المتزامن، يتفوق Node.js في المهام كثيفة الإدخال/الإخراج، مما يجعله مناسبًا تمامًا للويب. يمكن للتطبيقات الفورية، مثل بث الفيديو أو التطبيقات التي ترسل وتستقبل البيانات باستمرار، أن تعمل بكفاءة أكبر عند كتابتها باستخدام Node.js.
في هذا البرنامج التعليمي، ستُنشئ تطبيقك الأول باستخدام بيئة تشغيل Node.js. ستتعلم بعض مفاهيم Node المحددة، وستبدأ بإنشاء تطبيق يُساعد المستخدمين على التحقق من متغيرات بيئة نظامهم. للقيام بذلك، ستتعلم كيفية إخراج سلاسل نصية إلى وحدة التحكم، واستقبال مُدخلات المستخدم، والوصول إلى متغيرات البيئة.
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي، ستحتاج إلى:
- تم تثبيت Node.js على جهاز التطوير لديك. يستخدم هذا البرنامج التعليمي الإصدار 10.16.0 من Node.js. لتثبيته على نظام macOS أو Ubuntu 18.04، اتبع الخطوات الواردة في قسم "كيفية تثبيت Node.js وإنشاء بيئة تطوير محلية على macOS" أو قسم "التثبيت باستخدام PPA" في قسم "كيفية تثبيت Node.js على Ubuntu 18.04".
- يمكنك العثور على المعرفة الأساسية بلغة JavaScript هنا: كيفية البرمجة في JavaScript.
الخطوة 1 – الإخراج إلى وحدة التحكم
لكتابة برنامج "مرحبا بالعالم!"، افتح محرر نصوص سطر الأوامر مثل nano وقم بإنشاء ملف جديد:
nano hello.jsعند فتح محرر النصوص، أدخل الكود التالي:
console.log("Hello World");يوفر كائن وحدة التحكم في Node.js طرقًا بسيطة للكتابة إلى stdout أو stderr أو أي مسار Node.js آخر، وهو في معظم الحالات سطر الأوامر. تُطبع طريقة السجل في مسار stdout، لتتمكن من رؤيتها في وحدة التحكم.
في سياق Node.js، التدفقات هي كائنات يمكنها استقبال البيانات، مثل تدفق stdout، أو كائنات يمكنها إخراج البيانات، مثل مقبس شبكة أو ملف. في حالة تدفقات stdout وstderr، تُعرض أي بيانات مُرسلة إليها في وحدة التحكم. من أهم مميزات التدفقات سهولة إعادة توجيهها، بحيث يمكنك إعادة توجيه مخرجات برنامجك إلى ملف، على سبيل المثال.
احفظ الملف واخرج من nano بالضغط على CTRL+X، وعندما يُطلب منك حفظ الملف، اضغط على Y. الآن أصبح برنامجك جاهزًا للتشغيل.
الخطوة 2 – تشغيل البرنامج
لتشغيل هذا البرنامج، استخدم أمر العقدة كما يلي:
node hello.jsيتم تشغيل برنامج hello.js ويعرض الإخراج التالي:
Output
Hello Worldقرأ مُفسّر Node.js الملف ونفّذ console.log ("Hello World") باستدعاء دالة log لكائن وحدة التحكم العامة. وتم تمرير السلسلة النصية "Hello World" كمُعامل إلى دالة log.
على الرغم من أن علامات الاقتباس ضرورية في الكود للإشارة إلى أن النص عبارة عن سلسلة، إلا أنها لا تُطبع على الشاشة.
بعد التأكد من عمل البرنامج، دعونا نجعله أكثر تفاعلية.
الخطوة 3 - الحصول على مدخلات المستخدم عبر وسيطات سطر الأوامر
في كل مرة تُشغّل فيها أمر Node.js "أهلًا بالعالم!"، يُنتج البرنامج نفس النتيجة. ولجعل البرنامج أكثر ديناميكية، لنأخذ مُدخلات المستخدم ونعرضها على الشاشة.
غالبًا ما تقبل أدوات سطر الأوامر وسيطات مختلفة تُغيّر سلوكها. على سبيل المثال، سيؤدي تشغيل الأمر node مع الوسيطة –version إلى طباعة الإصدار المُثبّت بدلًا من تشغيل المُفسّر. عند هذه النقطة، تكون قد قبلت الكود الخاص بك عبر وسيطات سطر الأوامر.
إنشاء ملف arguments.js جديد باستخدام nano:
nano arguments.jsأدخل الرمز التالي:
console.log(process.argv);
كائن العملية هو كائن Node.js عام يحتوي على دوال وبيانات مرتبطة بعملية Node.js الجارية. الخاصية argv هي مصفوفة من السلاسل النصية تحتوي على جميع وسيطات سطر الأوامر المُعطاة للبرنامج.
احفظ الملف واخرج من nano عن طريق كتابة CTRL+X، واضغط على Y عند مطالبتك بحفظ الملف.
الآن عندما تقوم بتشغيل هذا البرنامج، فإنك تقدم وسيطة سطر أوامر مثل هذه:
node arguments.js hello worldوالنتيجة هي كما يلي:
Output
[ '/usr/bin/node',
'/home/sammy/first-program/arguments.js',
'hello',
'world' ]
الوسيطة الأولى في مصفوفة process.argv هي دائمًا موقع ملف Node.js الثنائي الذي يُشغّل البرنامج. الوسيطة الثانية هي دائمًا موقع الملف قيد التنفيذ. أما باقي الوسيطات فهي ما أدخله المستخدم، في هذه الحالة: hello world.
نحن مهتمون أكثر بالوسائط التي أدخلها المستخدم، وليس بالوسائط الافتراضية التي يوفرها Node.js. افتح ملف arguments.js للتحرير:
nano arguments.jsتغيير console.log(process.arg); إلى ما يلي:
console.log(process.argv.slice(2));بما أن argv مصفوفة، يمكنك استخدام دالة الشريحة المدمجة في جافا سكريبت، والتي تُرجع مجموعة من العناصر. عند تمرير دالة الشريحة مع 2 كمعامل، ستحصل على جميع عناصر argv بعد العنصر الثاني، أي المعاملات التي أدخلها المستخدم.
قم بتشغيل البرنامج مرة أخرى باستخدام أمر node ونفس الوسائط كما في المرة السابقة:
node arguments.js hello worldالآن، الناتج هو كما يلي:
Output
[ 'hello', 'world' ]الآن بعد أن أصبح بإمكانك جمع المدخلات من المستخدم، دعنا نجمع المدخلات من بيئة التطبيق.
الخطوة 4 – الوصول إلى متغيرات البيئة
متغيرات البيئة هي بيانات مفتاحية-قيمة تُخزَّن خارج التطبيق، ويُقدِّمها نظام التشغيل. عادةً ما يُعيِّنها النظام أو المستخدم، وهي متاحة لجميع العمليات الجارية لأغراض التكوين أو الحالة. يُمكنك الوصول إليها باستخدام كائن عملية Node.
استخدم nano لإنشاء ملف بيئة جديد.
nano environment.jsأضف الكود التالي:
console.log(process.env);يخزن كائن env جميع متغيرات البيئة المتاحة عند تشغيل تطبيق Node.js.
احفظ واخرج كما في السابق وقم بتشغيل ملف environment.js باستخدام الأمر node.
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 - الوصول إلى متغير بيئة محدد
في هذه الخطوة، سوف تقوم بعرض متغيرات البيئة وقيمها باستخدام الكائن العالمي process.env وطباعة قيمها في وحدة التحكم.
كائن process.env هو ربط بسيط بين أسماء متغيرات البيئة وقيمها، مُخزّنة كسلاسل نصية. وكما هو الحال في جميع كائنات JavaScript، يُمكن الوصول إلى الخاصية بالإشارة إلى اسمها بين قوسين.
افتح ملف environment.js للتحرير:
nano environment.jsتغيير console.log(process.env); إلى:
console.log(process.env["HOME"]);احفظ الملف وأغلقه. الآن، شغّل تطبيق environment.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، أي مُعامل سطر الأوامر الأول الذي أدخله المستخدم.
احفظ البرنامج واخرج من nano، ثم قم بتشغيل البرنامج كما يلي:
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 هي دالة JavaScript قياسية لجميع كائنات المصفوفة. تقبل دالة استدعاء تُستخدم عند التكرار على كل عنصر من عناصر المصفوفة. تستخدمها على مصفوفة 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);
}
});هنا، قمت بتعديل وظيفة الاستدعاء المقدمة إلى 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 التي تقرأ وسيطات المستخدم لعرض متغيرات البيئة.
إذا كنت ترغب في تطوير هذا الأمر، يمكنك تغيير سلوك هذا البرنامج بشكل أكبر. على سبيل المثال، قد ترغب في التحقق من صحة وسيطات سطر الأوامر قبل الطباعة. إذا كانت الوسيطة غير مُعرّفة، يمكنك إرجاع خطأ، ولن يتلقى المستخدم الناتج إلا إذا كانت جميع الوسيطات متغيرات بيئة صالحة.









