成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

NPM酷庫:through 快速創(chuàng)建雙向流

DTeam / 2510人閱讀

摘要:流做下載等功能時(shí)候,我們經(jīng)常會(huì)使用數(shù)據(jù)流模塊,因?yàn)?,在大文件下載場(chǎng)景下,如果使用接口將文件全部讀入內(nèi)存然后再返回給客戶端,很容易撐爆內(nèi)存,比如一個(gè)文件,同時(shí)有人在下載,那么服務(wù)就需要占用內(nèi)存。

NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫。

做下載等功能時(shí)候,我們經(jīng)常會(huì)使用數(shù)據(jù)流模塊(stream),因?yàn)?,在大文件下載場(chǎng)景下,如果使用fs.readFile()接口將文件全部讀入內(nèi)存然后再返回給客戶端,很容易撐爆內(nèi)存,比如一個(gè)文件200M,同時(shí)有100人在下載,那么服務(wù)就需要占用10G 內(nèi)存。

而使用stream,我們不會(huì)將文件全部讀入內(nèi)存,而只是在內(nèi)存中建立一個(gè)“水管”,所以內(nèi)存中不會(huì)堆積過多數(shù)據(jù):

ctx.body = fs.createReadStream("filename.ext");

上述代碼中,我們使用fs.createReadStream()方法創(chuàng)建了一個(gè)可讀流,Koa會(huì)直接讀取數(shù)據(jù)流,并返回給客戶端。

雙向流

如果一個(gè)流同時(shí)可讀、可寫,那么這就是一個(gè)雙向流。“水管”不適合解釋雙向流,我們用“電話線”來解釋,你說的話(寫數(shù)據(jù))對(duì)方能聽見(讀數(shù)據(jù)),同時(shí),對(duì)方說話(寫數(shù)據(jù))你也能聽見(讀數(shù)據(jù))。

妙用雙向流在很多時(shí)候能解決很復(fù)雜的問題,比如,數(shù)據(jù)庫導(dǎo)出場(chǎng)景。因?yàn)閿?shù)據(jù)庫里數(shù)據(jù)巨大,所以不能一下子讀到Node.js內(nèi)存中,我們可以創(chuàng)建一個(gè)只寫流,從數(shù)據(jù)庫逐條讀出數(shù)據(jù)然后調(diào)用只寫流,將數(shù)據(jù)寫入磁盤,所有數(shù)據(jù)全部導(dǎo)出到磁盤后,再參照上文創(chuàng)建一個(gè)只讀流,再將文件返回給客戶端。但是這樣存在問題的:

對(duì)磁盤大小有要求

在數(shù)據(jù)庫導(dǎo)出到磁盤的過程中,客戶端接受不到任何信息,很可能會(huì)造成瀏覽器超時(shí)訪問

白白消耗系統(tǒng)性能,浪費(fèi)磁盤IO

接下來我們就用雙向流解決這個(gè)問題:

through

使用 through 可以快速創(chuàng)建一個(gè)雙向流,相比自己調(diào)用stream模塊創(chuàng)建雙向流,through更方便,因?yàn)閠hrough已經(jīng)封裝了資源回收等機(jī)制。

const through = require("through");

// ...

const stream = through();
ctx.body = stream;

Order.find()
  .cursor()
  .eachAsync(async(order)=>{
    stream.write(order.toJSON());
  })
  .then(()=>{
    stream.end();
  });

上述代碼中,首先創(chuàng)建了一個(gè)雙向流,返回給Koa,然后以Mongoose模型舉例,查詢數(shù)據(jù)庫,并使用查詢游標(biāo)(cursor)逐條向流中寫數(shù)據(jù)。在流的另一端,Koa就能逐條讀出數(shù)據(jù)并返回給客戶端。

參考資料

https://github.com/dominictar...

https://nodejs.org/api/stream...

歡迎關(guān)注公眾號(hào):梁興臣

每天了解一個(gè)NPM庫,一年后成為Node.js高手

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/92800.html

相關(guān)文章

  • NPM酷庫:split 按行讀取文本

    摘要:酷庫,每天兩分鐘,了解一個(gè)流行庫。昨天,我們了解的中數(shù)據(jù)流的處理,并使用快速創(chuàng)建雙向流,今天,我們繼續(xù)討論數(shù)據(jù)流。我們昨天說到,使用數(shù)據(jù)流,可以分批讀取數(shù)據(jù)到內(nèi)存,而不用將文件一次性讀取到內(nèi)存。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫。 昨天,我們了解的Node.js中數(shù)據(jù)流的處理,并使用through快速創(chuàng)建雙向流,今天,我們繼續(xù)討論數(shù)據(jù)流。 我們昨天說到,使用數(shù)據(jù)流,可以分批...

    騫諱護(hù) 評(píng)論0 收藏0
  • NPM酷庫052:sax,按解析XML

    摘要:酷庫,每天兩分鐘,了解一個(gè)流行庫。在酷庫中,我們學(xué)習(xí)了如何使用庫將格式文檔字符串解析為的對(duì)象數(shù)據(jù),本期,我們繼續(xù)學(xué)習(xí),一個(gè)可以以流編程的方式解析。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫。· 在NPM酷庫051中,我們學(xué)習(xí)了如何使用xml2js庫將XML格式文檔字符串解析為JavaScript的對(duì)象數(shù)據(jù),本期,我們繼續(xù)學(xué)習(xí)sax,一個(gè)可以以流編程的方式解析XML。 使用流編程的方...

    pinecone 評(píng)論0 收藏0
  • NPM酷庫052:sax,按解析XML

    摘要:酷庫,每天兩分鐘,了解一個(gè)流行庫。在酷庫中,我們學(xué)習(xí)了如何使用庫將格式文檔字符串解析為的對(duì)象數(shù)據(jù),本期,我們繼續(xù)學(xué)習(xí),一個(gè)可以以流編程的方式解析。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫?!?在NPM酷庫051中,我們學(xué)習(xí)了如何使用xml2js庫將XML格式文檔字符串解析為JavaScript的對(duì)象數(shù)據(jù),本期,我們繼續(xù)學(xué)習(xí)sax,一個(gè)可以以流編程的方式解析XML。 使用流編程的方...

    zhangke3016 評(píng)論0 收藏0
  • NPM酷庫050:xmlbuilder,創(chuàng)建XML文件

    摘要:酷庫,每天兩分鐘,了解一個(gè)流行庫。在前幾期酷庫中,我們介紹了操作等數(shù)據(jù)格式文件,在外部系統(tǒng)接口中,我們還會(huì)經(jīng)常遇到格式的接口協(xié)議。本期,我們先來了解,用來創(chuàng)建格式文檔。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫?!?在前幾期NPM酷庫中,我們介紹了Node.js操作JSON5、YAML、CSON、CSV等數(shù)據(jù)格式文件,在外部系統(tǒng)接口中,我們還會(huì)經(jīng)常遇到XML格式的接口協(xié)議。從本期開...

    baukh789 評(píng)論0 收藏0
  • NPM酷庫050:xmlbuilder,創(chuàng)建XML文件

    摘要:酷庫,每天兩分鐘,了解一個(gè)流行庫。在前幾期酷庫中,我們介紹了操作等數(shù)據(jù)格式文件,在外部系統(tǒng)接口中,我們還會(huì)經(jīng)常遇到格式的接口協(xié)議。本期,我們先來了解,用來創(chuàng)建格式文檔。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫?!?在前幾期NPM酷庫中,我們介紹了Node.js操作JSON5、YAML、CSON、CSV等數(shù)據(jù)格式文件,在外部系統(tǒng)接口中,我們還會(huì)經(jīng)常遇到XML格式的接口協(xié)議。從本期開...

    taoszu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<