欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2015年07月29日 10:49:57   投稿:goldensun  
這篇文章主要介紹了淺析Node.js的Stream模塊中的Readable對象,是Node.js入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

我一直都很不愿意扯 nodejs 的流,因?yàn)閺牡谝淮慰吹剿揖陀X得它的設(shè)計(jì)實(shí)在是太惡心了。但是沒辦法,Stream 規(guī)范尚未普及,而且確實(shí)有很多東西都依賴了 nodejs 的流來實(shí)現(xiàn)的,所以我也只能捏著鼻子硬著頭皮來扯一扯這又臭又硬的 nodejs 流對象了。
  nodejs 自帶了一個叫 stream 的模塊,引入它便可以得到一組流對象構(gòu)造器。現(xiàn)在我只說最簡單的 stream.Readable。
  其實(shí)用過 nodejs 的幾乎都接觸過 Readable 的實(shí)例,只是平時沒太在意而已。一個非常典型的例子,http 模塊中我們處理每個請求時都會有 req 和 res 對象,req 其實(shí)就是一個 Readable 對象。我們可以在這個 req 上以流的形式讀到 HTTP 請求的實(shí)體部分。
  那么問題來了,為什么 http 模塊要在此處以流的方式設(shè)計(jì)呢?或者從另一個維度來問這個問題就是「nodejs 如果獲取 POST 請求的內(nèi)容?」。懂得用搜索引擎的同學(xué)肯定可以很容易地找到這么一個答案:監(jiān)聽 data 事件收集數(shù)據(jù),在 end 事件中把收集到的數(shù)據(jù)合并起來。是的,這是解決這個問題的方法。但是為什么它如此設(shè)計(jì)呢?像 PHP 那樣直接就可以取到 POST 內(nèi)容多好?其實(shí)這么設(shè)計(jì)是有好處的,如果我們接收到的數(shù)據(jù)是非法的,我可以馬上察覺,然后響應(yīng)并斷開連接。這樣可以避免一些不必要的傳輸成本。比如上傳圖片,也許用戶錯誤地選擇了一個很大的可執(zhí)行文件,我們不需要等到這個文件完全上傳完畢,只要一個文件頭部的若干字節(jié)就能判斷一個文件是否是圖片了。此處使用流的設(shè)計(jì)就可以先讀出前面的幾個字節(jié)來使用。
  上面提到的 data 事件和 end 事件都是 Readable 的事件,這兩個事件分別表示收到數(shù)據(jù)和數(shù)據(jù)接收完畢。所以其實(shí)我們早已知道了 Readable 的用法,只是很多人不知道它是 Readable 對象而已。
  但是上面這兩個事件僅僅是對 Readable 的消費(fèi)者而言的事件。內(nèi)部是如何把一個數(shù)據(jù)推送到 Readable 對象里面讓 Readable 觸發(fā)出這些事件的呢?那么它就是 push 方法。下面是一個例子,它創(chuàng)建了一個 Readable 對象,這個對象會流出一個遞增的數(shù)字(這里使用了 babel-node)

import stream from 'stream';

var r = new stream.Readable;

r.on('data', data => {
 console.log(data + '');
});

r.on('end', data => {
 console.log('end');
});

r._read = () => {
 // console.log('before read');
};

void function callee(i) {
 if(i < 10) {
  r.push(i + ''); // 只能傳入字符串或 Buffre 對象
 } else {
  r.push(null); // 當(dāng)輸入一個 null 時表示流傳輸完成,觸發(fā) end 事件 
 }
 setTimeout(callee, 500, i + 1);
}(0);

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

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

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

相關(guān)文章

  • Node.js模塊全局安裝路徑配置方法

    Node.js模塊全局安裝路徑配置方法

    今天小編就為大家分享一篇Node.js模塊全局安裝路徑配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • node故障定位頂級技巧動態(tài)追蹤Dynamic?Trace詳解

    node故障定位頂級技巧動態(tài)追蹤Dynamic?Trace詳解

    這篇文章主要為大家介紹了node故障定位頂級技巧動態(tài)追蹤Dynamic?Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 使用koa2創(chuàng)建web項(xiàng)目的方法步驟

    使用koa2創(chuàng)建web項(xiàng)目的方法步驟

    這篇文章主要介紹了使用koa2創(chuàng)建web項(xiàng)目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 在node環(huán)境下parse Smarty模板的使用示例代碼

    在node環(huán)境下parse Smarty模板的使用示例代碼

    這篇文章主要介紹了在node環(huán)境下parse Smarty模板的使用示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • node如何將package.json中的包降為低版本或者升級為高版本

    node如何將package.json中的包降為低版本或者升級為高版本

    比如現(xiàn)在你用某個包的當(dāng)前版本,但是你安裝的版本高了,那么你應(yīng)該這么做,首先刪除node項(xiàng)目中的node_modules目錄,防止安裝時的包不一致,下面給大家介紹node將package.json中的包降為低版本或者升級為高版本的方法,感興趣的朋友一起看看吧
    2023-11-11
  • Nodejs模塊載入運(yùn)行原理

    Nodejs模塊載入運(yùn)行原理

    本篇文章給大家詳細(xì)分享了Nodejs模塊載入運(yùn)行原理知識點(diǎn),對此有興趣的朋友可以跟著小編一起學(xué)習(xí)下。
    2018-02-02
  • Nodejs為什么選擇javascript為載體語言

    Nodejs為什么選擇javascript為載體語言

    準(zhǔn)備寫一個NodeJS方面的系列文章,由淺入深,循序漸進(jìn),秉承的理念是重思想,多實(shí)踐,勤能補(bǔ)拙,貴在堅(jiān)持。本文首先來點(diǎn)基礎(chǔ)知識的開篇吧。
    2015-01-01
  • nodejs搭建本地服務(wù)器輕松解決跨域問題

    nodejs搭建本地服務(wù)器輕松解決跨域問題

    這篇文章主要介紹了利用nodejs搭建本地服務(wù)器 解決跨域問題,需要的朋友可以參考下
    2018-03-03
  • 關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對比

    關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對比

    這篇文章主要給大家介紹了關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對比,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-01-01
  • 詳解Node.js讀寫中文內(nèi)容文件操作

    詳解Node.js讀寫中文內(nèi)容文件操作

    在本篇文章中我們給大家分享了關(guān)于Node.js讀寫中文內(nèi)容文件操作的相關(guān)知識點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2018-10-10

最新評論