理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn)
前言
前幾天別人請教我關(guān)于pipe的問題,我發(fā)現(xiàn)我雖然用了nodejs很久,但是由于每次用的不多所以經(jīng)?;乇躶tream的使用,導(dǎo)致一直不熟,現(xiàn)在重新學(xué)習(xí)整理一下相關(guān)知識。
通過nodeschool學(xué)習(xí)stream
nodeschool有一個stream-adventure教程教導(dǎo)stream的使用,很簡單
簡單stream進(jìn)行pipe
首先,我們可以通過管道將輸入定位到輸出,輸入輸出可以是控制臺或者文件流或者h(yuǎn)ttp請求,比如
process.stdin.pipe(process.stdout) process.stdin.pipe(fs.createWriteStream(path)) fs.createReadStream(path).pipe(process.stdin)
pipe中間進(jìn)行處理
如果我們想要在管道中間進(jìn)行處理,比如想將輸入的字符串變成大寫寫到輸出里,我們可以使用一些可以作為中間處理的框架,比如through2就很方便
var through2 = require('through2'); var stream = through2(write,end) process.stdin .pipe(stream) .pipe(process.stdout); function write(line,_,next){ this.push(line.toString().toUpperCase()) next(); }) function end(done){ done(); })
stream轉(zhuǎn)化成普通回調(diào)
當(dāng)我們輸入是流,而輸出是個普通函數(shù),我們需要把輸入流轉(zhuǎn)化為普通的buffer,這時可以試用concat-stream庫
var concat = require('concat-stream'); var reverseStream=concat(function(text){ console.log(text.toString().split("").reverse().join("")); }) process.stdin.pipe(reverseStream)
http server中的流
類似stdin和fs,http由于其特性也適合使用流,所以其自帶類似特性
var http = require('http'); var server = http.createServer(function(req,res){ req.pipe(res); })
既作為輸入也作為輸出的流
request框架實(shí)現(xiàn)了如下功能,將一個流pipe到request請求中,然后將流的內(nèi)容發(fā)給服務(wù)器,然后返回作為流供其他代碼使用,實(shí)現(xiàn)如下
var request = require('request'); var r = request.post('http://localhost:8099'); process.stdin.pipe(r).pipe(process.stdout)
分支管道
下邊是一個例子,這個例子將輸入管道中html包含loud class的元素放入另一個管道進(jìn)行大寫操作,然后最后合并成輸出
var trumpet = require('trumpet'); var through2 = require('through2'); var fs = require('fs'); var tr = trumpet(); var stream = tr.select('.loud').createStream(); var upper = through2(function(buf,_,next){ this.push(buf.toString().toUpperCase()); next(); }) stream.pipe(upper).pipe(stream); process.stdin.pipe(tr).pipe(process.stdout);
合并輸入輸出stream例子
合并后的輸入輸出可像前文request一樣使用,下邊這個例子實(shí)現(xiàn)了使用流的方式進(jìn)行子進(jìn)程調(diào)用
var spawn = require('child_process').spawn; var duplexer2 = require('duplexer2'); module.exports = function(cmd, args){ var c = spawn(cmd,args) return duplexer2(c.stdin,c.stdout) }
總結(jié)
通過上邊的例子,可以知道stream應(yīng)該還有如何合并等更復(fù)雜的應(yīng)用方式??傊w上符合如下特性:
- Stream分為readable、writeble
- Stream通過pipe方法控制流向
- httpServer和httpClient和file system和process.stdin\out\err通常可以作為stream
- Stream可以被on(event)轉(zhuǎn)化為普通的變量,普通變量可以被write轉(zhuǎn)換成stream
- Stream自身可以被拆分、合并、過濾
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nodejs socket服務(wù)端和客戶端簡單通信功能
這篇文章主要為大家詳細(xì)介紹了nodejs socket服務(wù)端和客戶端簡單通信功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09詳解koa2學(xué)習(xí)中使用 async 、await、promise解決異步的問題
這篇文章主要介紹了詳解koa2學(xué)習(xí)中使用 async 、await、promise解決異步的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11NodeJs Express框架實(shí)現(xiàn)服務(wù)器接口詳解
最近學(xué)習(xí)了基于前后端分離的開發(fā)模式,我前端使用Vue框架,后端使用nodejs開發(fā)API接口,下面這篇文章主要給大家介紹了關(guān)于nodejs使用Express框架寫后端接口的相關(guān)資料,需要的朋友可以參考下2022-08-08Node.js的路由、EJS模板引擎、GET和POST請求講解
這篇文章介紹了Node.js的路由、EJS模板引擎、GET和POST請求,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06