全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

理解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)

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自身可以被拆分、合并、过滤

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# 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小时内与您取得联系。