麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 語言 > JavaScript > 正文

淺析Node.js的Stream模塊中的Readable對象

2024-05-06 16:23:59
字體:
供稿:網(wǎng)友

這篇文章主要介紹了淺析Node.js的Stream模塊中的Readable對象,是Node.js入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

我一直都很不愿意扯 nodejs 的流,因為從第一次看到它我就覺得它的設(shè)計實在是太惡心了。但是沒辦法,Stream 規(guī)范尚未普及,而且確實有很多東西都依賴了 nodejs 的流來實現(xiàn)的,所以我也只能捏著鼻子硬著頭皮來扯一扯這又臭又硬的 nodejs 流對象了。

nodejs 自帶了一個叫 stream 的模塊,引入它便可以得到一組流對象構(gòu)造器。現(xiàn)在我只說最簡單的 stream.Readable。

其實用過 nodejs 的幾乎都接觸過 Readable 的實例,只是平時沒太在意而已。一個非常典型的例子,http 模塊中我們處理每個請求時都會有 req 和 res 對象,req 其實就是一個 Readable 對象。我們可以在這個 req 上以流的形式讀到 HTTP 請求的實體部分。

那么問題來了,為什么 http 模塊要在此處以流的方式設(shè)計呢?或者從另一個維度來問這個問題就是「nodejs 如果獲取 POST 請求的內(nèi)容?」。懂得用搜索引擎的同學(xué)肯定可以很容易地找到這么一個答案:監(jiān)聽 data 事件收集數(shù)據(jù),在 end 事件中把收集到的數(shù)據(jù)合并起來。是的,這是解決這個問題的方法。但是為什么它如此設(shè)計呢?像 PHP 那樣直接就可以取到 POST 內(nèi)容多好?其實這么設(shè)計是有好處的,如果我們接收到的數(shù)據(jù)是非法的,我可以馬上察覺,然后響應(yīng)并斷開連接。這樣可以避免一些不必要的傳輸成本。比如上傳圖片,也許用戶錯誤地選擇了一個很大的可執(zhí)行文件,我們不需要等到這個文件完全上傳完畢,只要一個文件頭部的若干字節(jié)就能判斷一個文件是否是圖片了。此處使用流的設(shè)計就可以先讀出前面的幾個字節(jié)來使用。

上面提到的 data 事件和 end 事件都是 Readable 的事件,這兩個事件分別表示收到數(shù)據(jù)和數(shù)據(jù)接收完畢。所以其實我們早已知道了 Readable 的用法,只是很多人不知道它是 Readable 對象而已。

但是上面這兩個事件僅僅是對 Readable 的消費者而言的事件。內(nèi)部是如何把一個數(shù)據(jù)推送到 Readable 對象里面讓 Readable 觸發(fā)出這些事件的呢?那么它就是 push 方法。下面是一個例子,它創(chuàng)建了一個 Readable 對象,這個對象會流出一個遞增的數(shù)字(這里使用了 babel-node)

 

 
  1. import stream from 'stream'
  2.  
  3. var r = new stream.Readable; 
  4.  
  5. r.on('data', data => { 
  6. console.log(data + ''); 
  7. }); 
  8.  
  9. r.on('end', data => { 
  10. console.log('end'); 
  11. }); 
  12.  
  13. r._read = () => { 
  14. // console.log('before read'); 
  15. }; 
  16.  
  17. void function callee(i) { 
  18. if(i < 10) { 
  19. r.push(i + ''); // 只能傳入字符串或 Buffre 對象 
  20. else { 
  21. r.push(null); // 當(dāng)輸入一個 null 時表示流傳輸完成,觸發(fā) end 事件  
  22. setTimeout(callee, 500, i + 1); 
  23. }(0); 

如果仔細看上面代碼就會發(fā)現(xiàn)一個很神奇的地方,這個代碼覆寫了 _read 方法,這是什么鬼?其實我也覺得這是個坑,這個私有命名風(fēng)格就不吐槽了,為何非要覆寫這個方法才算實現(xiàn)它?如果沒有覆寫這個方法,那么在調(diào)用 push 時將拋出異常:

 

 
  1. Error: not implemented 
  2. at Readable._read (_stream_readable.js:464:22) 
  3. at Readable.read (_stream_readable.js:341:10) 

以上這些便是 Readable 對象的基本用法。但是還有更多坑會踩到,這篇文章只是一個最簡單的介紹,讓大家學(xué)會如何造出一個能輸出數(shù)據(jù)的 Readable 對象而已。至于一些 read 之類的基本方法,反正這些也是不科學(xué)的設(shè)計之一。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: www.91pron| 黄色免费影片 | 免费观看国产精品视频 | 国产流白浆高潮在线观看 | 国产99视频精品免视看9 | 成人精品一区二区三区中文字幕 | 亚洲国产在 | 欧美日本在线播放 | 黄色片免费看网站 | 少妇的肉体的满足毛片 | 99在线热视频 | 精品国产一区二区三区四区在线 | 狠狠干五月天 | 一级做a爰片性色毛片2021 | 蜜桃av网| 逼特逼视频在线观看 | 国产免费福利视频 | 久久久成人精品 | 高潮娇喘嗯啊~文字 | 中文字幕一区二区三区久久 | 亚洲欧美一区二区三区在线观看 | 欧美精品成人一区二区在线观看 | 韩国一级免费视频 | 国产一区二区成人在线 | 91精品国产乱码久久桃 | 国产精品久久久久久久久粉嫩 | 日韩黄色精品视频 | 国产成人综合在线视频 | 毛片电影在线看 | 中文字幕伦乱 | 日韩美香港a一级毛片免费 欧美一级淫片007 | 欧洲狠狠鲁 | 神马久久精品综合 | 色诱亚洲精品久久久久久 | 欧美日韩亚洲精品一区二区三区 | 一级做a爱片久久毛片a高清 | 娇喘视频在线观看 | 免费看毛片的网站 | 久久国产精品久久久久久电车 | 午夜视频在线观看免费视频 | 一区国产在线 |