您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關nodejs中stream和pipe機制怎么實現的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
通過nodeschool學習stream
nodeschool有一個stream-adventure教程教導stream的使用,很簡單
簡單stream進行pipe
首先,我們可以通過管道將輸入定位到輸出,輸入輸出可以是控制臺或者文件流或者http請求,比如
process.stdin.pipe(process.stdout) process.stdin.pipe(fs.createWriteStream(path)) fs.createReadStream(path).pipe(process.stdin)
pipe中間進行處理
如果我們想要在管道中間進行處理,比如想將輸入的字符串變成大寫寫到輸出里,我們可以使用一些可以作為中間處理的框架,比如through3就很方便
var through3 = require('through3'); var stream = through3(write,end) process.stdin .pipe(stream) .pipe(process.stdout); function write(line,_,next){ this.push(line.toString().toUpperCase()) next(); }) function end(done){ done(); })
stream轉化成普通回調
當我們輸入是流,而輸出是個普通函數,我們需要把輸入流轉化為普通的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框架實現了如下功能,將一個流pipe到request請求中,然后將流的內容發給服務器,然后返回作為流供其他代碼使用,實現如下
var request = require('request'); var r = request.post('http://localhost:8099'); process.stdin.pipe(r).pipe(process.stdout)
分支管道
下邊是一個例子,這個例子將輸入管道中html包含loud class的元素放入另一個管道進行大寫操作,然后最后合并成輸出
var trumpet = require('trumpet'); var through3 = require('through3'); var fs = require('fs'); var tr = trumpet(); var stream = tr.select('.loud').createStream(); var upper = through3(function(buf,_,next){ this.push(buf.toString().toUpperCase()); next(); }) stream.pipe(upper).pipe(stream); process.stdin.pipe(tr).pipe(process.stdout);
合并輸入輸出stream例子
合并后的輸入輸出可像前文request一樣使用,下邊這個例子實現了使用流的方式進行子進程調用
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) }
總結
通過上邊的例子,可以知道stream應該還有如何合并等更復雜的應用方式。總之整體上符合如下特性:
Stream分為readable、writeble
Stream通過pipe方法控制流向
httpServer和httpClient和file system和process.stdin\out\err通常可以作為stream
Stream可以被on(event)轉化為普通的變量,普通變量可以被write轉換成stream
Stream自身可以被拆分、合并、過濾
感謝各位的閱讀!關于“nodejs中stream和pipe機制怎么實現”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。