前言
前几天别人请教我关于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)
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 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一样使用,下边这个例子实现了使用流的方式进行子进程调用
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自身可以被拆分、合并、过滤
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]