Node.js غير متزامن بشكل طبيعي ويعتمد على الأحداث ، وهو مثالي للتعامل مع المهام المتعلقة بـ I/O. إذا كنت تتعامل مع العمليات المتعلقة بـ I/O في تطبيقك ، فيمكنك الاستفادة من التدفقات في Node.js. لذلك ، دعونا نلقي نظرة على التدفقات بالتفصيل ونفهم كيف تبسط عمليات الإدخال/الإخراج.
ما هو التدفق
التدفقات هي خطوط أنابيب UNIX تتيح لك قراءة البيانات بسهولة من مصدر بيانات ثم التدفق إلى وجهة أخرى.
ببساطة ، البث ليس شيئًا مميزًا ، إنه مجرد حدث ينفذ بعض الطرق. وفقًا للطريقة التي ينفذها ، يمكن أن يصبح الدفق دفقًا قابلًا للقراءة (قابل للقراءة) ، أو دفق قابل للكتابة (قابل للكتابة) ، أو دفق ثنائي الاتجاه (دوبلكس ، قابل للقراءة وقابل للكتابة).
يتيح لك الدفق القابل للقراءة قراءة البيانات من مصدر بيانات ، بينما يتيح لك الدفق القابل للكتابة كتابة البيانات إلى وجهتك.
إذا كنت قد استخدمت Node.js ، فمن المحتمل أن تكون قد واجهت تدفقًا.
على سبيل المثال ، في خادم Node.js HTTP ، يكون الطلب عبارة عن دفق قابل للقراءة والاستجابة عبارة عن دفق قابل للكتابة.
ربما تكون قد استخدمت أيضًا وحدة FS ، والتي يمكن أن تساعدك على التعامل مع التدفقات القابلة للقراءة والقابلة للكتابة.
الآن دعك تتعلم بعض الأساسيات وفهم أنواع مختلفة من التدفقات. ستناقش هذه المقالة تيارات قابلة للقراءة وقابلة للكتابة. تدفقات ثنائية الاتجاه خارج نطاق هذه المقالة ولن نناقشها.
تدفقات قابلة للقراءة
يمكننا استخدام دفق قابل للقراءة لقراءة البيانات من مصدر بيانات ، والذي يمكن أن يكون أي شيء ، مثل ملف في النظام ، أو المخزن المؤقت في الذاكرة ، أو حتى تدفقات أخرى. لأن التدفقات هي eventemitters ، فإنها ترسل البيانات مع مختلف الأحداث. سوف نستخدم هذه الأحداث لجعل التدفق يعمل.
اقرأ البيانات من الدفق
أفضل طريقة لقراءة البيانات من دفق هي الاستماع إلى أحداث البيانات وإضافة وظيفة رد الاتصال. عند تدفق البيانات ، سيرسل الدفق القابل للقراءة حدث بيانات وسيتم تشغيل وظيفة رد الاتصال. ألقِ نظرة على مقتطف الكود التالي:
var fs = require ('fs') ؛ var readablestream = fs.createadStream ('file.txt') ؛ var data = '' ؛ var readablestream.on ('data' ، function (chunk) {data += chunk ؛}) ؛ readablestream.on ('end' ، function () {console.log (data) ؛}}) ؛سوف يمنحك Fs.CreeCreeDstream دفقًا قابلًا للقراءة.
في البداية ، لم يكن هذا الدفق ديناميكيًا. عند إضافة مستمع حدث للبيانات وإضافة وظيفة رد الاتصال ، ستصبح تتدفق. بعد ذلك ، سوف يقرأ جزءًا صغيرًا من البيانات ويمررها إلى وظيفة رد الاتصال.
يحدد تطبيق الدفق تردد الزناد لحدث البيانات. على سبيل المثال ، سيؤدي طلب HTTP إلى تشغيل حدث البيانات عند قراءة عدة كيلو بايت من البيانات. عندما تقرأ البيانات من ملف ، يمكنك أن تقرر تشغيل حدث البيانات عند الانتهاء من السطر.
عندما لا توجد بيانات للقراءة (عند قراءتها في نهاية الملف) ، سيرسل الدفق حدثًا نهائيًا. في المثال أعلاه ، استمعنا إلى هذا الحدث وقمنا بطباعة البيانات عند الانتهاء من قراءة الملف.
هناك طريقة أخرى لقراءة التدفقات. تحتاج فقط إلى الاستمرار في استدعاء طريقة القراءة () في مثيل الدفق قبل القراءة حتى نهاية الملف.
var fs = require ('fs') ؛ var readablestream = fs.createadStream ('file.txt') ؛ var data = '' ؛ var chunk ؛ readablestream.on ('readable' ، function () {while ((chunk = readablestream.read ())! console.log (data) ؛}) ؛تقرأ طريقة Read () البيانات من المخزن المؤقت الداخلي ، وتُرجع NULL عندما لا توجد بيانات للقراءة.
لذلك ، في حلقة بينما نتحقق مما إذا كانت القراءة () إرجاع فارغة ، وعندما تعود فارغة ، سيتم إنهاء الحلقة.
تجدر الإشارة إلى أنه عندما نتمكن من قراءة البيانات من الدفق ، سيتم إطلاق الحدث القابل للقراءة.
تعيين الترميز
بشكل افتراضي ، ما تقرأه من الدفق هو كائن عازلة. إذا كنت تقرأ سلسلة ، فهذا ليس لك. لذلك ، يمكنك تعيين ترميز الدفق عن طريق استدعاء readable.setencoding () كما هو الحال في المثال التالي:
var fs = require ('fs') ؛ var readablestream = fs.createadStream ('file.txt') ؛ var data = '' ؛ readablestream.setencoding ('utf8') ؛ readablestream.on ('data' ، function (chunk) {data += chunk ؛})في المثال أعلاه ، إذا قمنا بتعيين ترميز الدفق على UTF8 ، فسيتم تحليل البيانات في UTF8 ، وسيكون الجزء في وظيفة رد الاتصال سلسلة.
الأنابيب
تعتبر خطوط الأنابيب آلية رائعة حيث يمكنك قراءة البيانات من مصدر بيانات دون إدارة حالة الدفق بنفسك وكتابتها إلى وجهتك. لنلقي نظرة على المثال التالي:
var fs = require ('fs') ؛ var readablestream = fs.createadStream ('file1.txt') ؛ var writablestream = fs.createwRiteReam ('file2.txt') ؛ readablestream.pipe (writablestream) ؛يستخدم المثال أعلاه طريقة PIPE () لكتابة محتوى File1 إلى File2. نظرًا لأن Pipe () سوف يساعدك في إدارة تدفق البيانات ، فلا داعي للقلق بشأن سرعة تدفق البيانات. هذا يجعل الأنابيب () بسيطة للغاية وسهلة الاستخدام.
تجدر الإشارة إلى أن Pipe () إرجاع دفق الوجهة ، بحيث يمكنك بسهولة ربط تدفقات متعددة!
الرابط (التسلسل)
لنفترض أن هناك ملف أرشيف وتريد فك ضغطه. هناك العديد من الطرق لإنجاز هذه المهمة. ولكن أبسط طريقة هي استخدام خطوط الأنابيب والروابط:
var fs = require ('fs') ؛ var zlib = require ('zlib') ؛ fs.createadStream ('input.txt.gz') .pipe (zlib.creategunzip ()) .pipe (fs.createWriteReam ('output.txt')) ؛أولاً ، نقوم بإنشاء دفق قابل للقراءة عبر input.txt.gz ثم ندعه يقوم ببث دفق zlib.creategunzip () ، والذي يقوم بإلغاء ضغط المحتوى. أخيرًا ، نضيف دفقًا قابلًا للكتابة لكتابة المحتوى الذي تم إلغاء الضغط عليه إلى ملف آخر.
طرق أخرى
لقد ناقشنا بعض المفاهيم المهمة في التدفقات القابلة للقراءة ، وإليك بعض الطرق التي تحتاج إلى معرفتها:
1. القراءة. pause () هذه الطريقة ستعمل على إيقاف تدفق التدفق. وبعبارة أخرى ، لن يؤدي ذلك إلى حدوث حدث البيانات مرة أخرى.
2.REATABLE.RESUME () طريقة هي عكس ما سبق وستسمح لتدفق الإيقاف المؤقت لاستئناف التدفق.
3. قابلة للقمامة. سوف تزيل طريقة unpipe () الوجهة. إذا كانت هناك معلمات تم تمريرها ، فسيسمح ذلك للتيار القابل للقراءة بإيقاف الوجهة المحددة لـ Liu Xiang ، وإلا فإنه سيزيل جميع الوجهات.
تدفقات قابلة للكتابة
يتيح لك الدفق القابل للكتابة كتابة البيانات إلى وجهتك. تمامًا مثل التدفقات القابلة للقراءة ، فهذه هي الحدث ، كما أنها تؤدي إلى أحداث مختلفة. دعونا نلقي نظرة على الأحداث والأساليب التي سيتم تشغيلها في الدفق القابل للكتابة.
اكتب للدفق
لكتابة البيانات كدفق قابل للكتابة ، تحتاج إلى استدعاء طريقة الكتابة () في مثيل الدفق القابل للكتابة ، ومعرفة المثال التالي:
var fs = require ('fs') ؛ var readablestream = fs.createadStream ('file1.txt') ؛ var writablestream = fs.createwRiteReam ('file2.txt') ؛ readablestream.setencoding ('utf8') ؛ readablestream.on ('data' ، function (chunk)الكود أعلاه بسيط للغاية ، فهو يقرأ فقط البيانات من دفق الإدخال ويكتبها إلى الوجهة باستخدام الكتابة ().
تقوم هذه الطريقة بإرجاع قيمة منطقية للإشارة إلى ما إذا كانت الكتابة ناجحة. إذا تم إرجاع صحيح ، فهذا يعني أن الكتابة ناجحة ويمكنك الاستمرار في كتابة المزيد من البيانات. إذا كان هذا خطأ ، فهذا يعني حدوث شيء خطأ ولا يمكنك متابعة الكتابة الآن. يؤدي الدفق القابل للكتابة إلى حدوث حدث تصريف لإخبارك أنه يمكنك متابعة كتابة البيانات.
بعد كتابة البيانات
عندما لا تحتاج إلى كتابة البيانات ، يمكنك استدعاء طريقة النهاية () لإخبار الدفق الذي انتهيت من الكتابة. على افتراض وجود كائن استجابة HTTP ، سترسل عادةً استجابة للمتصفح:
Res.Write ('بعض البيانات !!') ؛
res.end () ؛
عند استدعاء End () ، يتم كتابة جميع البيانات وسيؤدي الدفق بعد ذلك إلى حدوث حدث إنهاء. لاحظ أنه بعد استدعاء end () ، لم يعد بإمكانك كتابة البيانات في الدفق القابل للكتابة. على سبيل المثال ، سيقوم الرمز التالي بالإبلاغ عن خطأ:
Res.Write ('بعض البيانات !!') ؛
res.end () ؛
Res.Write ("محاولة الكتابة مرة أخرى") ؛ //خطأ !
فيما يلي بعض الأحداث المهمة المتعلقة بالتيارات القابلة للكتابة:
1. يطلق النار عند حدوث خطأ في الكتابة أو الربط
2. أنبوب عندما يكون الدفق القابل للقراءة مرتبطًا بالدفق القابل للكتابة ، سيتم تشغيل هذا الحدث
3. سوف يطلق النار عندما يتم استدعاء unpipe بواسطة تيار قابل للقراءة
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.