本篇文章主要介紹了理解nodejs的stream和pipe機制的原理和實現,具有一定的參考價值,感興趣的小伙伴們可以參考一下
##前言
前幾天別人請教我關於pipe的問題,我發現我雖然用了nodejs很久,但是由於每次用的不多所以經常迴避stream的使用,導致一直不熟,現在重新學習整理一下相關知識。透過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中間進行處理
如果我們想要在管道中間進行處理,例如想將輸入的字串變成大寫寫到輸出裡,我們可以使用一些可以作為中間處理的框架,例如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轉換成普通回調
當我們輸入是流,而輸出是普通函數,我們需要把輸入流轉換成普通的buffer,這時可以試試concat-stream函式庫
#
var concat = require('concat-stream'); var reverseStream=concat(function(text){ console.log(text.toString().split("").reverse().join("")); }) process.stdin.pipe(reverseStream)
類似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 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);
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) }
以上是nodejs中stream和pipe的深度理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!