🟩 شرح Node.js

التدفّقات (Streams) والـ Buffer

لماذا التدفّقات؟

تخيّل قراءة ملف بحجم 2 جيجابايت. لو حمّلته كاملًا في الذاكرة لانهار الخادم. التدفّقات تعالج البيانات قطعة قطعة (chunks) دون تحميلها كلها دفعة واحدة — كفاءة عالية في الذاكرة.

أنواع التدفّقات

النوعالوظيفةمثال
Readableللقراءةقراءة ملف
Writableللكتابةكتابة ملف
Duplexقراءة وكتابةمقبس شبكة
Transformتحويل أثناء المرورضغط/تشفير

قراءة ملف بتدفّق

const fs = require("fs");

const stream = fs.createReadStream("big.txt", "utf-8");

stream.on("data", (chunk) => {
  console.log("وصلت قطعة بحجم:", chunk.length);
});

stream.on("end", () => console.log("انتهت القراءة"));
stream.on("error", (err) => console.error(err));

لاحظ الأحداث (data, end, error) — التدفّقات مبنية على EventEmitter.

التوصيل بـ pipe

أقوى ميزة — توصيل تدفّق قراءة بتدفّق كتابة مباشرة (نسخ ملف بكفاءة):

const fs = require("fs");

const readStream = fs.createReadStream("source.txt");
const writeStream = fs.createWriteStream("copy.txt");

readStream.pipe(writeStream);

مثال واقعي — ضغط ملف أثناء النسخ:

const fs = require("fs");
const zlib = require("zlib");

fs.createReadStream("file.txt")
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream("file.txt.gz"));

الـ Buffer

الـ Buffer يمثّل بيانات ثنائية خام (صور، ملفات، شبكة) — قطع التدفّق غالبًا Buffers:

const buf = Buffer.from("مرحبا");
console.log(buf);              // <Buffer d9 85 ...>
console.log(buf.length);      // عدد البايتات
console.log(buf.toString());  // مرحبا

أين تُستخدم؟

  • بثّ الفيديو والصوت.
  • رفع/تنزيل الملفات الكبيرة.
  • معالجة طلبات HTTP (الجسم يصل كتدفّق).

أخطاء شائعة

  • قراءة ملف ضخم بـ readFile بدل تدفّق فتمتلئ الذاكرة.
  • نسيان معالجة حدث error على التدفّق فينهار التطبيق.

🎯 التالي: وحدة التشفير (Crypto).