最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn)

 更新時(shí)間:2017年08月12日 09:42:47   作者:Vieri_32  
本篇文章主要介紹了理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

前幾天別人請教我關(guān)于pipe的問題,我發(fā)現(xiàn)我雖然用了nodejs很久,但是由于每次用的不多所以經(jīng)?;乇躶tream的使用,導(dǎo)致一直不熟,現(xiàn)在重新學(xué)習(xí)整理一下相關(guān)知識(shí)。

通過nodeschool學(xué)習(xí)stream

nodeschool有一個(gè)stream-adventure教程教導(dǎo)stream的使用,很簡單

簡單stream進(jìn)行pipe

首先,我們可以通過管道將輸入定位到輸出,輸入輸出可以是控制臺(tái)或者文件流或者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)我們輸入是流,而輸出是個(gè)普通函數(shù),我們需要把輸入流轉(zhuǎn)化為普通的buffer,這時(shí)可以試用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)了如下功能,將一個(gè)流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)

分支管道

下邊是一個(gè)例子,這個(gè)例子將輸入管道中html包含loud class的元素放入另一個(gè)管道進(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一樣使用,下邊這個(gè)例子實(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通??梢宰鳛閟tream
  • Stream可以被on(event)轉(zhuǎn)化為普通的變量,普通變量可以被write轉(zhuǎn)換成stream
  • Stream自身可以被拆分、合并、過濾

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Express本地測試HTTPS的示例代碼

    Express本地測試HTTPS的示例代碼

    這篇文章主要介紹了Express本地測試HTTPS的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Nodejs異步回調(diào)之異常處理實(shí)例分析

    Nodejs異步回調(diào)之異常處理實(shí)例分析

    這篇文章主要介紹了Nodejs異步回調(diào)之異常處理,結(jié)合實(shí)例形式分析了nodejs基于中間件進(jìn)行異步回調(diào)異常處理過程出現(xiàn)的問題與相應(yīng)的解決方法,需要的朋友可以參考下
    2018-06-06
  • node?NPM庫string-random生成隨機(jī)字符串學(xué)習(xí)使用

    node?NPM庫string-random生成隨機(jī)字符串學(xué)習(xí)使用

    這篇文章主要為大家介紹了node?NPM庫string-random生成隨機(jī)字符串學(xué)習(xí)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • node實(shí)現(xiàn)將json轉(zhuǎn)為excel

    node實(shí)現(xiàn)將json轉(zhuǎn)為excel

    平時(shí)我們寫代碼處理的數(shù)據(jù)格式一般都是json格式的數(shù)據(jù),但有時(shí)候我們也需要將數(shù)據(jù)轉(zhuǎn)為excel格式進(jìn)行保存或分享,所以下面我們就來學(xué)習(xí)一下如何通過node實(shí)現(xiàn)json轉(zhuǎn)excel吧
    2024-11-11
  • node.js express安裝及示例網(wǎng)站搭建方法(分享)

    node.js express安裝及示例網(wǎng)站搭建方法(分享)

    下面小編就為大家?guī)硪黄猲ode.js express安裝及示例網(wǎng)站搭建方法(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • nodejs npm package.json中文文檔

    nodejs npm package.json中文文檔

    這篇文章主要介紹了nodejs npm package.json中文文檔,本文檔中描述的很多行為都受npm-config(7)的影響,需要的朋友可以參考下
    2014-09-09
  • Node.js插件安裝圖文教程

    Node.js插件安裝圖文教程

    Node.js是一個(gè)基于Chrome JavaScript運(yùn)行時(shí)建立的平臺(tái), 用于方便地搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。本文給大家介紹Node.js插件安裝的教程,非常實(shí)用,特此分享給大家,需要的朋友一起學(xué)習(xí)吧
    2016-05-05
  • NodeJS連接MongoDB數(shù)據(jù)庫時(shí)報(bào)錯(cuò)的快速解決方法

    NodeJS連接MongoDB數(shù)據(jù)庫時(shí)報(bào)錯(cuò)的快速解決方法

    下面小編就為大家?guī)硪黄狽odeJS連接MongoDB數(shù)據(jù)庫時(shí)報(bào)錯(cuò)的快速解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考
    2016-05-05
  • Node.js使用gm拼裝sprite圖片

    Node.js使用gm拼裝sprite圖片

    這篇文章主要介紹了Node.js使用gm拼裝sprite圖片的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • node爬取微博的數(shù)據(jù)的簡單封裝庫nodeweibo使用指南

    node爬取微博的數(shù)據(jù)的簡單封裝庫nodeweibo使用指南

    這篇文章主要介紹了node爬取微博的數(shù)據(jù)的簡單封裝庫nodeweibo使用指南,需要的朋友可以參考下
    2015-01-01

最新評論

通海县| 横山县| 类乌齐县| 辽阳县| 象山县| 中方县| 西华县| 集贤县| 青龙| 华宁县| 莲花县| 灵寿县| 井研县| 抚松县| 弥渡县| 鹤岗市| 汉寿县| 苗栗市| 方城县| 琼中| 漳州市| 达日县| 凤台县| 和平县| 两当县| 崇礼县| 乐平市| 凤凰县| 梧州市| 比如县| 拉孜县| 喀什市| 玉屏| 敖汉旗| 宁波市| 巨野县| 嘉鱼县| 防城港市| 高雄市| 张北县| 高阳县|