iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Modern Web

Node.js 非專業解說系列 第 18

DAY18: 淺談Stream

  • 分享至 

  • xImage
  •  

今天要記錄的是Stream,當我在研讀這個部分時,發現我的參考書介紹的比較簡略一點,但實際查資料也發現Stream在Nodjs占了舉足輕重的位置。所以今天會把研讀的重點做個整理。
在第DAY12:HTTP前情提要中,介紹Buffer處有短暫提到Stream。
Stream是Nodejs中的流式數據,而Stream模塊給予基本的API,而在前幾篇的實作中也都有Stream的影子在,
像是文件的讀取:

//HTTP請求文件(內容為轉換的狀態)
var http=require("http");
var fs=require("fs");
var server=http.createServer((req,res)=>
{
    fs.readFile("./Heartbeat.txt",(err,data)=>
{
        res.end(data);
    }); 
});
server.listen(3000);

每接到一次請求,會把butterfly.txt讀進記憶體,再取出給客戶端。
前提是,因為butterfly.txt內容"小",若有一份內容"大"的要讀取,
依照前面所述的步驟,會消耗不少伺服器的記憶體,使用者等待的時間就會變長。

Stream總共有四個基礎類型以及常見的例子:

  • Readable: 可讀流 (ex: fs.creatReadStream() )
    是數據生產者(sourse),也就是提供數據的源頭。
  • Writable: 可寫流 (ex: fs.creatWriteStream() )
    是數據消耗者,也就是數據最後的目標。
  • Duplex: 雙工流 (ex: net.Socket)
    同時擁有Readable與Writable,輸入與輸出之間存在轉換的關係,可以因為輸入與輸出的長度不一樣。
  • Transform: 轉換流 (ex: zlib.creatDflate() )
    同樣也具備Readable與Writable,只是與Duplex不同的是輸入和輸出需要一樣。像是壓縮、解壓縮。

Stream都是Event(EventEmmitter)的實例。
其實也可以說Stream是Event與Buffer的混合版
還有一個很重要的東西!就是pipe方法!

pipe()

pipe就像是一個管道,把流與流之間都串連起來,發揮到最大的效用!
pipe會串連數據生產者與數據消耗者,可以多個數據串接。通常對於複製數據很方便!!

總結:
明天會繼續做Stream相關的例子,今天的部分,若有理解錯誤,再請指教!!
另外,附上我在理解Stream時,查閱到的一些網站,覺得很有幫助貼出來與大家分享,
他們比我的更專業解說得更清楚!非常感謝這些專業人士與網站。


上一篇
DAY17: 實作提交表單的Post請求
下一篇
DAY19: Stream pipe()做起來!!
系列文
Node.js 非專業解說30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言