در حال بارگذاری...

جریان‌ها

جریان‌ها در نود.جی‌اس (Streams) یک مکانیزم بسیار قدرتمند برای مدیریت جریان داده‌ها به صورت تدریجی و بدون بارگذاری کامل آن‌ها در حافظه هستند. این قابلیت به ویژه هنگام کار با فایل‌های بزرگ، داده‌های شبکه یا جریان‌های واقعی-زمان مفید است و باعث افزایش کارایی و کاهش مصرف حافظه می‌شود. جریان‌ها اساساً با مدل I/O غیر مسدودکننده و event-driven نود.جی‌اس همخوانی دارند و به توسعه‌دهندگان اجازه می‌دهند تا برنامه‌هایی مقیاس‌پذیر و بهینه ایجاد کنند.
در این آموزش، انواع اصلی جریان‌ها شامل Readable، Writable، Duplex و Transform را بررسی خواهیم کرد. شما خواهید آموخت چگونه داده‌ها را به صورت chunk-wise پردازش کنید، الگوریتم‌های تبدیل داده را اعمال کنید و با رعایت اصول OOP کدهای ماژولار و قابل استفاده مجدد بنویسید. همچنین نحوه مدیریت backpressure، مدیریت خطاها و بهینه‌سازی عملکرد در جریان‌ها پوشش داده می‌شود تا برنامه‌های شما در محیط‌های تولیدی پایدار و ایمن باشند.
با پایان این آموزش، شما قادر خواهید بود جریان‌ها را برای پردازش داده‌های بزرگ، پیاده‌سازی جریان‌های واقعی-زمان و ایجاد برنامه‌های نود.جی‌اس مقیاس‌پذیر به کار ببرید. همچنین با تکنیک‌های دیباگینگ و نظارت بر جریان‌ها آشنا خواهید شد تا از عملکرد و پایداری سیستم اطمینان حاصل کنید.

مثال پایه

text
TEXT Code
const fs = require('fs');

// ایجاد Readable Stream
const readableStream = fs.createReadStream('input.txt', { encoding: 'utf8' });

// ایجاد Writable Stream
const writableStream = fs.createWriteStream('output.txt');

// پردازش chunk به chunk داده‌ها
readableStream.on('data', (chunk) => {
console.log('طول chunk خوانده شده:', chunk.length);
writableStream.write(chunk);
});

readableStream.on('end', () => {
console.log('خواندن کامل شد');
writableStream.end();
});

readableStream.on('error', (err) => {
console.error('خطا در Readable Stream:', err);
});

writableStream.on('finish', () => {
console.log('نوشتن کامل شد');
});

در این مثال، یک جریان خواندنی (Readable) برای خواندن داده‌ها از یک فایل متنی ایجاد شده است و جریان نوشتنی (Writable) برای نوشتن داده‌ها در فایل دیگر استفاده شده است. هر بار که یک chunk داده خوانده می‌شود، با استفاده از رویداد 'data' پردازش شده و به جریان Writable منتقل می‌شود. رویداد 'end' پایان خواندن را اعلام می‌کند و رویداد 'error' برای مدیریت خطاها استفاده می‌شود. این روش از بارگذاری کامل فایل در حافظه جلوگیری کرده و مدیریت backpressure را بهبود می‌بخشد.
این مثال همچنین نحوه استفاده از بافرها، callback‌های asynchronous و syntax مدولار نود.جی‌اس را نشان می‌دهد. این الگو برای پردازش داده‌های بزرگ، جریان‌دهی شبکه و برنامه‌های واقعی-زمان پایه‌ای قوی فراهم می‌کند.

مثال کاربردی

text
TEXT Code
const { Transform, pipeline } = require('stream');
const fs = require('fs');

// Transform Stream: تبدیل متن به حروف بزرگ
const upperCaseTransform = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk.toString().toUpperCase());
callback();
}
});

// استفاده ایمن از pipeline
pipeline(
fs.createReadStream('input.txt'),
upperCaseTransform,
fs.createWriteStream('output_uppercase.txt'),
(err) => {
if (err) {
console.error('خطا در pipeline جریان‌ها:', err);
} else {
console.log('تبدیل فایل به حروف بزرگ با موفقیت انجام شد');
}
}
);

در این مثال پیشرفته، یک Transform Stream برای تبدیل داده‌ها به حروف بزرگ استفاده شده است. هر chunk داده به صورت real-time تغییر می‌کند. تابع pipeline چندین جریان را به هم متصل می‌کند و مدیریت خطاها و آزادسازی منابع را خودکار انجام می‌دهد. این الگو مطابق اصول OOP است، زیرا منطق تبدیل داده‌ها در یک شیء encapsulated قرار دارد. Transform Stream می‌تواند برای رمزنگاری، فشرده‌سازی یا فیلتر کردن داده‌ها نیز استفاده شود. این مثال بر modularity، مدیریت خطاها و بهینه‌سازی عملکرد تمرکز دارد و برای برنامه‌های واقعی-زمان مناسب است.

بهترین شیوه‌ها در استفاده از جریان‌ها شامل استفاده از pipeline برای اتصال ایمن جریان‌ها، نگهداری منطق تبدیل در Transform Streams و مدیریت backpressure است. هر جریان باید listener برای رویداد 'error' داشته باشد تا از unhandled exceptions و memory leaks جلوگیری شود. اشتباهات رایج شامل بارگذاری کامل فایل‌های بزرگ در حافظه، نادیده گرفتن خطاها و عدم بستن صحیح جریان‌ها است. برای بهینه‌سازی عملکرد، تنظیم اندازه buffer، عملیات asynchronous و استفاده مجدد از جریان‌ها پیشنهاد می‌شود. همچنین اعتبارسنجی داده‌های خارجی برای امنیت ضروری است و برای دیباگینگ می‌توان از process.memoryUsage و رویدادهای جریان استفاده کرد.

📊 جدول مرجع

نود.جی‌اس Element/Concept Description Usage Example
Readable Stream خواندن داده‌ها به صورت chunk-wise fs.createReadStream('file.txt')
Writable Stream نوشتن داده‌ها به صورت chunk-wise fs.createWriteStream('output.txt')
Transform Stream تبدیل یا پردازش داده‌ها در جریان new Transform({ transform(chunk, enc, cb){ cb(null, chunk.toString().toUpperCase()); } })
Duplex Stream خواندن و نوشتن همزمان داده‌ها const duplex = new Duplex({ read(){}, write(chunk, enc, cb){ cb(); } })
Pipeline اتصال ایمن چند جریان pipeline(readable, transform, writable, err=>{...})

پس از مطالعه این آموزش، شما درک جامعی از جریان‌ها در نود.جی‌اس خواهید داشت و قادر به استفاده از Readable، Writable، Transform و Duplex Streams خواهید بود. همچنین نحوه اتصال ایمن جریان‌ها با pipeline و پردازش داده‌های واقعی-زمان را فرا می‌گیرید. برای ادامه، مطالعه شبکه و HTTP streams و الگوهای event-driven پیشرفته توصیه می‌شود. تمرین عملی با پروژه‌هایی مانند log processing، تبدیل فایل یا streaming APIs مهارت‌های شما را تقویت می‌کند. منابع اضافی شامل مستندات رسمی نود.جی‌اس، پروژه‌های GitHub و انجمن‌های توسعه‌دهندگان هستند.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

4
سوالات
🎯
70%
برای قبولی
♾️
زمان
🔄
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود