Node中的streams流的具體使用
Node中的streams流
streams流是Node中的最好的特性之一。它在我們的開發(fā)過程當中可以幫助我們做很多事情。比如通過流的方式梳理大量數(shù)據(jù),或者幫我們分離應(yīng)用程序。
和streams流相關(guān)的內(nèi)容有哪些呢?大致有這么幾點:
- 處理大量數(shù)據(jù)
- 使用管道方法
- 轉(zhuǎn)換流
- 讀寫流
- 解耦I(lǐng)/O
轉(zhuǎn)換流
Node中的流其實是允許我們進行異步編程的。最常見的就是轉(zhuǎn)換流,它就像是一個接收輸入并且產(chǎn)生輸出的大黑盒子。
舉個例子:
const through = require('through2')
const upper = through((chunk, enc, cb) => {
cb(null, chunk.toString().toUpperCase())
})
process.stdin.pipe(upper).pipe(process.stdout)執(zhí)行它,我們在終端輸入的內(nèi)容,它會轉(zhuǎn)換成大寫并且重新輸出到終端。

through2模塊在核心流的構(gòu)造器上又加了一層。當我們創(chuàng)建upper時,我們給through傳了一個回調(diào)函數(shù)進去,這個回調(diào)函數(shù)就是轉(zhuǎn)換方法。流中的每段數(shù)據(jù)都將通過這個方法,chunk表示數(shù)據(jù),enc表示數(shù)據(jù)的編碼格式,cb是一個回調(diào)函數(shù),我們執(zhí)行它表示我們已經(jīng)完成了數(shù)據(jù)處理,并且進行下一步處理。
使用through2模塊進行處理數(shù)據(jù),一方面可讀性更強,另一方面,可以保持Node版本之前的行為一致。
創(chuàng)建
大多數(shù)情況下,當我們使用核心模塊時,我們會直接使用。例如:
const fs = require('fs')
const stream = require('stream')但是經(jīng)驗告訴我們:不要直接使用核心流模塊。我們可以使用readable-stream,雖然名字不一樣,但是這確實可以保證我們在不同的Node版本之間保持很好的一致性。所以在代碼中我們應(yīng)該盡可能的使用readable-stream
const stream = require('readable-stream')看這個例子:
const stream = require('readable-stream')
const util = require('util')
function MyTransform(opts){
stream.Transform.call(this,opts)
}
util.inherits(MyTransform,stream.Transform)
MyTransform.prototype._transform = function(chunk,enc,cb){
cb(null,chunk.toString().toUpperCase())
}
const upper = new MyTransform()
process.stdin.pipe(upper).pipe(process.stdout)在Node的早期版本中,這是創(chuàng)建流的標準方式。但是es6出現(xiàn)以后,有一種更簡單的方法。
const {Transform} = require('readable-stream')
class MyTransform extends Transform {
_transform(chunk,enc,cb){
cb(null,chunk.toString().toUpperCase(),)
}
}
const upper = new MyTransform()
process.stdin.pipe(upper).pipe(process.stdout)對象模式
如果我們的流不是返回的序列換的數(shù)據(jù),一般是buffer或者string,我們需要將它轉(zhuǎn)換成一個對象。但是我們需要知道具體傳了多少數(shù)據(jù)過來。
默認情況下,當不使用對象模式時,流將在暫停前緩沖大約16KB的數(shù)據(jù)。使用對象模式時,當緩沖了16個對象后,它將開始暫停。
再來看一個例子:
const through = require('through2')
const ndjson = require('ndjson')
const xyz = through.obj(({ x, y }, enc, cb) => {
cb(null, { z: x + y })
})
xyz.pipe(ndjson.stringify()).pipe(process.stdout)
xyz.write({ x: 199, y: 3 })
xyz.write({ x: 10, y: 12 })這個例子會打印下面的結(jié)果

我們用through2模塊的obj方法創(chuàng)建了一個流。然后通過pipe方法write的信息進行stringify然后再傳給process.stdout,最后返回了計算后的結(jié)果。
我們也可以使用readable-stream模塊來實現(xiàn)這個:
const {Transform} = require('readable-stream')
const {serialize} = require('ndjson')
const xyz = Transform({
objMode:true,
transform:({x,y},enc,cb)=>{
cb(null,{z:x+y})
}
})
xyz.pipe(ndjson.stringify()).pipe(process.stdout)
xyz.write({ x: 199, y: 3 })
xyz.write({ x: 10, y: 12 })同樣可以實現(xiàn)上面的效果。
最后
到此這篇關(guān)于Node中的streams流的具體使用的文章就介紹到這了,更多相關(guān)Node streams流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node連接MySQL并封裝其增刪改查的實現(xiàn)代碼
本文主要介紹了Node連接MySQL并封裝其增刪改查的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
nodejs實現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報警聲)的方法
這篇文章主要介紹了nodejs實現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報警聲)的方法,結(jié)合實例形式分析了nodejs發(fā)出蜂鳴聲的原理及具體應(yīng)用方法,需要的朋友可以參考下2017-01-01
基于NodeJS+MongoDB+AngularJS+Bootstrap開發(fā)書店案例分析
這章的目的是為了把前面所學(xué)習(xí)的內(nèi)容整合一下,這個示例完成一個簡單圖書管理模塊,因為中間需要使用到Bootstrap這里先介紹Bootstrap2017-01-01

