"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > التدفقات: Node.js

التدفقات: Node.js

تم النشر بتاريخ 2024-11-01
تصفح:130

Streams: Node.js

الدليل الكامل للتدفقات في Node.js

تعد التدفقات في Node.js طريقة قوية للتعامل مع قراءة البيانات وكتابتها بطريقة مستمرة. فهي تسمح لك بمعالجة البيانات بكفاءة، خاصة عند التعامل مع كميات كبيرة من المعلومات أو عمليات الإدخال/الإخراج. سيغطي هذا الدليل أنواع التدفقات وكيفية استخدامها وأمثلة عملية لمساعدتك على فهم كيفية عمل التدفقات في Node.js.

ما هي التدفقات؟

التدفقات هي كائنات تسمح لك بقراءة البيانات من مصدر أو كتابة البيانات إلى وجهة بطريقة مستمرة. إنها مثالية لمعالجة البيانات قطعة قطعة بدلاً من قراءة أو كتابة ملفات أو مخازن مؤقتة بأكملها مرة واحدة. يعد هذا مفيدًا بشكل خاص عند العمل مع مجموعات البيانات الكبيرة، لأنه يمكن أن يقلل بشكل كبير من استخدام الذاكرة.

المفاهيم الأساسية

  • وضع التدفق: تتدفق البيانات تلقائيًا من المصدر إلى الوجهة.
  • وضع الإيقاف المؤقت: يجب قراءة البيانات يدويًا من المصدر.
  • تدفقات قابلة للقراءة: التدفقات التي يمكنك قراءة البيانات منها.
  • التدفقات القابلة للكتابة: التدفقات التي يمكنك كتابة البيانات إليها.
  • التدفقات المزدوجة: التدفقات التي يمكنها قراءة البيانات وكتابتها.
  • تحويل التدفقات: التدفقات التي تعدل أو تحول البيانات أثناء قراءتها أو كتابتها.

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

  1. التدفقات القابلة للقراءة : تتيح لك هذه التدفقات قراءة البيانات. تتضمن الأمثلة fs.createReadStream() وhttp.IncomingMessage.

  2. التدفقات القابلة للكتابة : تسمح لك هذه التدفقات بكتابة البيانات. تتضمن الأمثلة fs.createWriteStream() وhttp.ServerResponse.

  3. التدفقات المزدوجة : يمكن لهذه التدفقات قراءة البيانات وكتابتها. تتضمن الأمثلة مآخذ TCP وnet.Duplex.

  4. تحويل التدفقات : هذا هو نوع من التدفق المزدوج الذي يمكنه تعديل البيانات أثناء قراءتها أو كتابتها. تتضمن الأمثلة zlib.createGzip() للضغط.

إنشاء تيارات قابلة للقراءة

يمكنك إنشاء دفق قابل للقراءة باستخدام وحدة fs المدمجة لقراءة الملفات أو استخدام دفق. قابل للقراءة لإنشاء تدفقات مخصصة قابلة للقراءة.

مثال: قراءة ملف باستخدام دفق قابل للقراءة

const fs = require('fs');

// Create a readable stream
const readableStream = fs.createReadStream('example.txt', { encoding: 'utf8' });

// Handling the 'data' event
readableStream.on('data', (chunk) => {
    console.log('New chunk received:', chunk);
});

// Handling the 'end' event
readableStream.on('end', () => {
    console.log('No more data to read.');
});

مثال: الدفق المخصص القابل للقراءة

const { Readable } = require('stream');

class MyReadableStream extends Readable {
    constructor(options) {
        super(options);
        this.current = 0;
    }

    _read(size) {
        if (this.current  {
    console.log('Received:', chunk.toString());
});

إنشاء تيارات قابلة للكتابة

يمكنك إنشاء تدفقات قابلة للكتابة باستخدام الوحدة fs أو عن طريق توسيع فئةstream.Writable.

مثال: الكتابة إلى ملف باستخدام دفق قابل للكتابة

const fs = require('fs');

// Create a writable stream
const writableStream = fs.createWriteStream('output.txt');

// Write data to the stream
writableStream.write('Hello, World!\n');
writableStream.write('Writing to a file using streams.\n');

// End the stream
writableStream.end(() => {
    console.log('Finished writing to file.');
});

مثال: الدفق المخصص القابل للكتابة

const { Writable } = require('stream');

class MyWritableStream extends Writable {
    _write(chunk, encoding, callback) {
        console.log('Writing:', chunk.toString());
        callback(); // Call when done
    }
}

const myWritableStream = new MyWritableStream();
myWritableStream.write('Hello, World!\n');
myWritableStream.write('Writing to custom writable stream.\n');
myWritableStream.end();

استخدام التدفقات المزدوجة

يمكن للتدفقات المزدوجة قراءة البيانات وكتابتها في وقت واحد. حالة الاستخدام الشائعة هي مآخذ TCP.

مثال: إنشاء دفق مزدوج

const { Duplex } = require('stream');

class MyDuplexStream extends Duplex {
    _read(size) {
        this.push('Data from duplex stream\n');
        this.push(null); // No more data
    }

    _write(chunk, encoding, callback) {
        console.log('Received:', chunk.toString());
        callback();
    }
}

const myDuplexStream = new MyDuplexStream();
myDuplexStream.on('data', (chunk) => {
    console.log('Reading:', chunk.toString());
});

// Write to the duplex stream
myDuplexStream.write('Hello, Duplex!\n');
myDuplexStream.end();

باستخدام تحويل التدفقات

تعتبر تدفقات التحويل مفيدة لتعديل البيانات أثناء تدفقها عبر الدفق. على سبيل المثال، يمكنك استخدام دفق تحويل لضغط البيانات.

مثال: إنشاء دفق تحويل

const { Transform } = require('stream');

class MyTransformStream extends Transform {
    _transform(chunk, encoding, callback) {
        const upperChunk = chunk.toString().toUpperCase();
        this.push(upperChunk);
        callback();
    }
}

const myTransformStream = new MyTransformStream();
myTransformStream.on('data', (chunk) => {
    console.log('Transformed:', chunk.toString());
});

// Pipe data through the transform stream
process.stdin.pipe(myTransformStream).pipe(process.stdout);

تيارات الأنابيب

إحدى الميزات القوية للتدفقات هي القدرة على ربطها معًا. تسمح لك الأنابيب بتوصيل دفق قابل للقراءة إلى دفق قابل للكتابة، مما يجعل من السهل نقل البيانات.

مثال: تيارات الأنابيب

const fs = require('fs');

// Create a readable stream
const readableStream = fs.createReadStream('input.txt');

// Create a writable stream
const writableStream = fs.createWriteStream('output.txt');

// Pipe the readable stream to the writable stream
readableStream.pipe(writableStream);

writableStream.on('finish', () => {
    console.log('Data has been written to output.txt');
});

دفق الأحداث في Node.js

1. أحداث التدفقات المقروءة

تُصدر التدفقات القابلة للقراءة العديد من الأحداث المهمة التي تساعدك على إدارة تدفق البيانات:

  • البيانات: تنبعث عندما تكون هناك مجموعة من البيانات متاحة للقراءة.
  • end: ينبعث عندما لا يكون هناك المزيد من البيانات للقراءة.
  • خطأ: ينبعث عند حدوث خطأ أثناء القراءة.
  • إغلاق: ينبعث عندما يتم إغلاق الدفق وأي موارد أساسية (مثل واصفات الملفات).

مثال: أحداث الدفق القابلة للقراءة

const fs = require('fs');

const readableStream = fs.createReadStream('example.txt');

readableStream.on('data', (chunk) => {
    console.log('Received chunk:', chunk.toString());
});

readableStream.on('end', () => {
    console.log('No more data to read.');
});

readableStream.on('error', (err) => {
    console.error('Error occurred:', err);
});

readableStream.on('close', () => {
    console.log('Stream closed.');
});

2. أحداث التدفقات القابلة للكتابة

تصدر التدفقات القابلة للكتابة أيضًا العديد من الأحداث:

  • استنزاف: ينبعث عندما يكون الدفق جاهزًا لقبول المزيد من البيانات بعد امتلاءه.
  • finish: ينبعث عندما تتم كتابة كافة البيانات إلى الدفق ويتم استدعاء طريقة end().
  • خطأ: ينبعث عند حدوث خطأ أثناء الكتابة.
  • إغلاق: ينبعث عند إغلاق الدفق وأي موارد أساسية.

مثال: أحداث الدفق القابلة للكتابة

const fs = require('fs');

const writableStream = fs.createWriteStream('output.txt');

writableStream.on('finish', () => {
    console.log('All data has been written to output.txt');
});

writableStream.on('error', (err) => {
    console.error('Error occurred:', err);
});

// Writing data
writableStream.write('Hello, World!\n');
writableStream.write('Writing to a file using streams.\n');
writableStream.end(); // Call end to finish the writing process

3. تحويل تيارات الأحداث

ترث تيارات التحويل الأحداث من كل من التدفقات القابلة للقراءة والكتابة، وتصدر:

  • البيانات: تنبعث عندما تكون القطعة المحولة متاحة للقراءة.
  • end: ينبعث عندما لا يكون هناك المزيد من البيانات للتحويل.
  • خطأ: ينبعث عند حدوث خطأ أثناء التحويل.
  • إنهاء: ينبعث عندما تتم معالجة جميع البيانات وكتابتها.

مثال: تحويل أحداث الدفق

const { Transform } = require('stream');

class MyTransformStream extends Transform {
    _transform(chunk, encoding, callback) {
        const upperChunk = chunk.toString().toUpperCase();
        this.push(upperChunk);
        callback();
    }
}

const myTransformStream = new MyTransformStream();

myTransformStream.on('data', (chunk) => {
    console.log('Transformed chunk:', chunk.toString());
});

myTransformStream.on('end', () => {
    console.log('No more data to transform.');
});

myTransformStream.on('error', (err) => {
    console.error('Error occurred:', err);
});

// Write data to the transform stream
myTransformStream.write('Hello, World!\n');
myTransformStream.write('Transforming this text.\n');
myTransformStream.end(); // End the stream

ملخص الأحداث

  • تدفقات قابلة للقراءة: البيانات، النهاية، الخطأ، الإغلاق
  • التدفقات القابلة للكتابة: التصريف، النهاية، الخطأ، الإغلاق
  • تحويل التدفقات: يرث البيانات، النهاية، الخطأ، النهاية من كل من التدفقات القابلة للقراءة والكتابة

خاتمة

توفر التدفقات في Node.js طريقة قوية وفعالة للتعامل مع البيانات بطريقة مستمرة. إنها تسمح لك بقراءة البيانات وكتابتها قطعة قطعة، مما يجعلها مفيدة بشكل خاص لعمليات الإدخال/الإخراج والعمل مع مجموعات البيانات الكبيرة. إن فهم كيفية إنشاء واستخدام أنواع مختلفة من التدفقات، بالإضافة إلى كيفية التعامل مع الأحداث، سيساعدك على بناء تطبيقات أكثر كفاءة وقابلة للتطوير في Node.js.

سواء كنت تقوم بإنشاء تدفقات قابلة للقراءة، أو قابلة للكتابة، أو مزدوجة، أو تحويلية، فإن مرونة واجهة برمجة تطبيقات الدفق تسمح لك بالتعامل مع معالجة البيانات بطريقة تناسب احتياجات تطبيقك على أفضل وجه.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/harshm03/streams-nodejs-2j32?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3