前言

前几天别人请教我关于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应该还有如何合并等更复杂的应用方式。总之整体上符合如下特性:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# nodejs
# stream
# pipe
# 回调
# Node.js pipe实现源码解析
# JavaScript Reduce使用详解
# 详解JavaScript之Array.reduce源码解读
# JavaScript中reduce()的5个基本用法示例
# JS数组reduce()方法原理及使用技巧解析
# JS数组Reduce方法功能与用法实例详解
# JS数组方法reduce的用法实例分析
# JavaScript reduce和reduceRight详解
# 详解JS中的compose函数和pipe函数用法
# 是一个
# 实现了
# 是个
# 不多
# 很久
# 我们可以
# 用了
# 很简单
# 可以使用
# 写到
# 以其
# 当我们
# 教我
# 前几天
# 自带
# 转化为
# 转换成
# 于其
# 很方便
相关文章:
如何在云主机上快速搭建多站点网站?
建站之星如何修改网站生成路径?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
建站之星如何取消后台验证码生成?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
已有域名能否直接搭建网站?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
简单实现Android文件上传
如何快速搭建高效简练网站?
电商网站制作公司有哪些,1688网是什么意思?
实例解析Array和String方法
如何在万网自助建站中设置域名及备案?
常州企业建站如何选择最佳模板?
网站制作员失业,怎样查看自己网站的注册者?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
建站主机选虚拟主机还是云服务器更好?
如何在新浪SAE免费搭建个人博客?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
建站之星代理如何优化在线客服效率?
如何选择高效可靠的多用户建站源码资源?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
ppt制作免费网站有哪些,ppt模板免费下载网站?
魔方云NAT建站如何实现端口转发?
如何在IIS中新建站点并解决端口绑定冲突?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何用免费手机建站系统零基础打造专业网站?
如何快速搭建自助建站会员专属系统?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
在线教育网站制作平台,山西立德教育官网?
建站之星微信建站一键生成小程序+多端营销系统
如何用腾讯建站主机快速创建免费网站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何用低价快速搭建高质量网站?
如何选择可靠的免备案建站服务器?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
Thinkphp 中 distinct 的用法解析
网站微信制作软件,如何制作微信链接?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
建站DNS解析失败?如何正确配置域名服务器?
如何在腾讯云服务器快速搭建个人网站?
长沙做网站要多少钱,长沙国安网络怎么样?
公司门户网站制作流程,华为官网怎么做?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何在局域网内绑定自建网站域名?
高端企业智能建站程序:SEO优化与响应式模板定制开发
*请认真填写需求信息,我们会在24小时内与您取得联系。