دروس Node.js مع أمثلة قابلة للتشغيل
دروس Node.js مجانية مع أمثلة تعمل داخل الصفحة: الملفات، والوحدات، وحلقة الأحداث، وخوادم Express ترسل إليها الطلبات، وMongoDB وJWT. عدّل الشيفرة وشغّلها من جديد.
ابدأ الدورةالبداية
- ما هو Node.jsNode.js بيئة تشغيل تنفّذ JavaScript خارج المتصفح، على الخوادم وفي الطرفية. ليس لغة وليس إطار عمل: هو محرك V8 مع حلقة أحداث وواجهات للملفات والشبكات والعمليات.
- Node.js مقابل JavaScriptJavaScript هي اللغة، وNode.js برنامج يشغّلها خارج المتصفح. الصياغة واحدة تمامًا، لكن الكائنات العامة والواجهات المدمجة المحيطة بشيفرتك مختلفة.
- process.argvprocess.argv مصفوفة بسطر الأوامر الذي شغّل برنامجك: الملف التنفيذي node، ثم مسار السكربت، ثم كل وسيط كتبته. استخدم process.argv.slice(2) لتحصل على وسائطك فقط.
- process.envprocess.env كائن يحمل متغيرات البيئة التي بدأ بها برنامج Node.js. كل قيمة إما نص أو undefined، لذلك حوّل الأرقام والقيم المنطقية بنفسك وأعطِ كل متغير قيمة افتراضية.
- قراءة مدخلات المستخدملا توجد دالة prompt() في Node.js. لتسأل المستخدم سؤالًا في الطرفية، أنشئ واجهة readline على process.stdin واستدعِ question()، أو انتظرها بـ await عبر readline/promises.
الملفات والمسارات
- fs.readFileاقرأ ملفًا في Node.js عبر fs.readFile (مع callback) أو fs.readFileSync أو await readFile من fs/promises. مرّر 'utf8' لتحصل على نص، وتعامل مع ENOENT حين يكون الملف غير موجود.
- fs.writeFileاكتب ملفًا في Node.js عبر fs.writeFile أو fs.writeFileSync أو await writeFile من fs/promises. يُنشأ الملف إن لم يكن موجودًا ويُستبدل إن كان موجودًا؛ واستخدم appendFile للإضافة إلى نهايته.
- fs/promisesfs/promises نسخة الوعود من وحدة fs في Node: الدوال readFile وwriteFile وreaddir وstat وmkdir وrm وrename كلها تعيد وعودًا تنتظرها بـ await، وتلتقط الأخطاء بـ try/catch.
- وحدة pathتبني وحدة path مسارات الملفات وتفككها بالطريقة الصحيحة لنظام التشغيل. تلصق path.join المقاطع ببعضها، وتحوّلها path.resolve إلى مسار مطلق انطلاقًا من المجلد الحالي.
Node غير المتزامن
- حلقة الأحداثتشغّل حلقة الأحداث (event loop) في Node.js دوال callback على مراحل (timers وpoll وcheck وclose)، وبين كل callback وآخر تفرّغ طابور process.nextTick ثم طابور الوعود. شغّل الأمثلة لترى الترتيب الدقيق.
- EventEmitterيتيح EventEmitter من وحدة events في Node لكائن ما أن يعلن أحداثًا مسماة عبر emit، ويتيح لشيفرة أخرى أن تستجيب عبر on أو once. يعمل المستمعون بشكل متزامن، بترتيب إضافتهم.
HTTP وExpress
- خادم HTTPتأخذ `http.createServer()` دالة واحدة تعمل مع كل طلب وتستقبل `req` و`res`. تقرأ الطريقة وعنوان URL من `req`، ثم تضبط الحالة والترويسات والجسم على `res` وتستدعي `res.end()`.
- التوجيه في Expressالمسار في Express طريقة ومسار ومعالج: `app.get('/users/:id', handler)`. اجمع المسارات المترابطة في `express.Router()` وركّبه تحت بادئة عبر `app.use('/api', router)`.
- Middleware في Expressالـ middleware في Express دالة `(req, res, next)` تعمل قبل معالج المسار. يمكنها قراءة الطلب أو تغييره، أو إنهاؤه باستجابة، أو استدعاء `next()` لتمريره إلى ما بعدها.
- req.params وquery وbodyيحمل `req.params` الأجزاء المسماة من المسار (`/users/:id`)، و`req.query` سلسلة الاستعلام (`?sort=new`)، و`req.body` جسم الطلب بعد تحليله، وهو `undefined` حتى تضيف محللًا مثل `express.json()`.
- معالجة الأخطاءمعالج الأخطاء في Express هو middleware بأربعة وسائط، `(err, req, res, next)`، يُسجَّل بعد المسارات. يرسل إليه Express 5 الأخطاء المرمية، واستدعاءات `next(err)`، والوعود المرفوضة من المعالجات غير المتزامنة.
- express.staticيقدّم `app.use(express.static(path.join(__dirname, 'public')))` كل ملف في المجلد `public` على عنوان URL المطابق: الملف `public/style.css` يجيب على `/style.css`. أضف مسار تركيب لتقديمها تحت بادئة.
- CORS في Expressخطأ CORS يعني أن المتصفح منع صفحة من قراءة استجابة واجهة API لأن الاستجابة لم تسمح بمصدر الصفحة. أصلحه على الخادم بإرسال `Access-Control-Allow-Origin` والإجابة على طلبات `OPTIONS` التمهيدية، يدويًا أو بحزمة `cors`.
البيانات والمصادقة
- MongoDBاستخدم MongoDB من Node.js عبر برنامج التشغيل الرسمي mongodb: اتصل بـ MongoClient، ثم أضف المستندات وابحث عنها وحدّثها واحذفها في مجموعة، كل ذلك مع async/await.
- JWTJWT رمز موقّع من ثلاثة أجزاء بترميز base64url، يصدره الخادم عند تسجيل الدخول ويتحقق منه مع كل طلب. في Node.js توقّعه وتتحقق منه بحزمة jose أو jsonwebtoken ومفتاح سري.