استریم ها Nodejs Streams
انچه در این مقاله میخوانید (TOC) :
- استریم چیست؟
- چرا استریم؟
- مثالی از استریم
- pipe چیست؟
- api هایی از ند جی اس که با استریم بوجود امده اند Streams-powered Node.js APIs
- انواع استریم
- چگونگی ساخت یک استریم Readable
- چگونگی ساخت یک استریم Writable
- چگونگی گرفتن داده ها از استریم Readable
- چگونگی ارسال داده ها به استریم Writable
- سیگنال کردن استریم Writable که نوشتن روی آن تمام شده!
- ساخت یک استریم از نوع transform
استریم چیست؟
استریم ها یکی از مباحث پایه ای هستند که باعث قدرت اپلیکیشن های ند جی اس هستند.
برای نوشتن و خواندن و مدیریت فایل ها، ارتباطات شبکه یا تبادل اطلاعات end to end بصورت کارامد وجود دارند.
استریم ها مختص ند جی اس نیستند. آنها ده ها سال پیش در سیستم عامل یونیکس معرفی شدند و برنامه ها می توانند با استریم های عبوری از طریق اپراتور pipe با یکدیگر ارتباط برقرار کنند.
به عنوان مثال ، به روش سنتی ، وقتی به برنامه می گویید یک فایل را بخواند ، فایل از ابتدا تا انتها در حافظه خوانده می شود و سپس آن را پردازش می کند.
با استفاده از استریم، بصورت قطعه قطعه آن را می خوانید ، محتوای آن را پردازش می کنید بدون اینکه همه آن را در حافظه نگه دارید.
تمام API های استریم بر روی ماژول stream در Node.js ساخته شده اند. همه استریم ها نمونه هایی از EventEmitter هستند.
چرا استریم؟
استریم ها اساساً دو مزیت عمده نسبت به استفاده از سایر روش های مدیریت داده فراهم می کنند:
مزیت حافظه: میتوان بجای بارگیری حجم زیادی از داده ها در حافظه، ان ها را پردازش کرد.
مزیت زمان: پردازش داده از همان لحظه اول اغاز میشود بجای اینکه تا بارگیری تمام داده ها صبر شود.
مثالی از استریم
یک مثال ساده، خواندن فایل از دیسک است.
با ماژول fs میتوان یک فایل را خواند و با http سرو کرد.
const http = require('http')
const fs = require('fs')
const server = http.createServer(function(req, res) {
fs.readFile(__dirname + '/data.txt', (err, data) => {
res.end(data)
})
})
server.listen(3000)
متد readFile
تمام محتوا را میخواند و وقتی تمام شد از کال بک فانکشن بیرون میزند.
متد res.end(data)
در داخل کال بک فانکشن، محتوای فایل را به سرور http برمیگرداند.
اگر حجم فایل زیاد باشد، عملیات کمی به تعویق می افتد. همین طور برای استریم ها اتفاق می افتد:
const http = require('http')
const fs = require('fs')
const server = http.createServer((req, res) => {
const stream = fs.createReadStream(__dirname + '/data.txt')
stream.pipe(res)
})
server.listen(3000)
بجای اینکه منتظر بمانیم تا فایل بصورت کامل خوانده شود، به محض در دسترس بودن اولین chunk (تیکه) از داده ها ان را به سرور http برای کاربر میفرستیم.
pipe چیست؟
مثال بالایی دارای خط stream.pipe(res)
می باشد: متد pipe در استریم فایل فراخوانده شده است.
این کد چکار میکند؟ منبع را به مقصد میبرد. (پایپ میکند – لوله کشی میکند pipe )
در استریم منبع، فراخوانده شده است. در این نمونه، استریم فایل به عنوان پاسخ http پایپ (لوله کشی) شده است.
مقدار بازگردانده شده از pipe ، استریم مقصد است. به ما اجازه میدهد زنجیر وار از ان استفاده کنیم.
src.pipe(dest1).pipe(dest2)
کد زیر هم معادل کد بالایی است:
src.pipe(dest1)
dest1.pipe(dest2)
api هایی از ند جی اس که با استریم بوجود امده اند Streams-powered Node.js APIs
بخاطر مزایایی که دارند بسیاری از core module های ند جی اس توانایی مدیریت استریم دارند:
//
process.stdin
process.stdout
process.stderr
//
fs.createReadStream()
fs.createWriteStream()
//
net.connect()
http.request()
//
zlib.createGzip()
zlib.createGunzip()
zlib.createDeflate()
zlib.createInflate()
انواع استریم
استریم های خواندنی Readable
استریم های نوشتنی Writable
استریم های خواندنی و نوشتنی Duplex
استریم های Transform
: شبیه duplex هستند اما ورودی ها را تغییر داده اند.