iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >理解nodejs的stream和pipe机制的原理和实现
  • 364
分享到

理解nodejs的stream和pipe机制的原理和实现

原理机制nodejs 2022-06-04 17:06:53 364人浏览 薄情痞子
摘要

前言 前几天别人请教我关于pipe的问题,我发现我虽然用了nodejs很久,但是由于每次用的不多所以经常回避stream的使用,导致一直不熟,现在重新学习整理一下相关知识。 通过nodeschool学习st

前言

前几天别人请教我关于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.stdinouterr通常可以作为stream Stream可以被on(event)转化为普通的变量,普通变量可以被write转换成stream Stream自身可以被拆分、合并、过滤

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

--结束END--

本文标题: 理解nodejs的stream和pipe机制的原理和实现

本文链接: https://www.lsjlt.com/news/12428.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • nodejs中stream和pipe机制怎么实现
    这篇文章给大家分享的是有关nodejs中stream和pipe机制怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。通过nodeschool学习streamnodeschoo...
    99+
    2024-04-02
  • Java和Dubbo的SPI机制原理解析
    SPI: 简单理解就是,你一个接口有多种实现,然后在代码运行时候,具体选用那个实现,这时候我们就可以通过一些特定的方式来告诉程序寻用那个实现类,这就是SPI。 JAVA的SPI 全称...
    99+
    2024-04-02
  • Nodejs和Session的原理及用法
    这篇文章主要介绍“Nodejs和Session的原理及用法”,在日常操作中,相信很多人在Nodejs和Session的原理及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Redis持久化机制实现原理和流程
    Redis持久化机制实现原理是什么?流程是什么?持久化就是把内存中的数据存放到磁盘中,防止宕机后内存数据丢失。按照指定的时间间隔内将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中...
    99+
    2023-04-26
    Redis 持久化 Redis持久化原理 Redis持久化流程
  • java的Builder原理和实现详解
    首先给一个简单的Builder设计模式的例子: 主实现类代码如下: public class CompanyClient { public String company...
    99+
    2024-04-02
  • android handler的机制和原理是什么
    Android中的Handler机制是用于在不同线程之间进行消息传递和任务调度的一种机制。它的原理是基于消息队列和Looper。1....
    99+
    2023-08-24
    android handler
  • Vue数据代理的原理和实现
    目录Object.defineProperty那么在Vue中如何应用数据代理呢总结Object.defineProperty defineProperty方法会直接在一个对象上定义一...
    99+
    2022-11-13
    Vue数据代理 Vue数据代理原理 vue数据代理怎么实现的
  • php的运行机制和原理是什么
    PHP的运行机制和原理如下: 客户端请求:当用户在浏览器中输入一个URL并发送请求时,服务器会接收到该请求。 Web服务器:...
    99+
    2023-10-28
    php
  • Http Cookie机制及Cookie的实现原理
    目录1. 为什么需要Cookie?2. Cookie的类型3. Cookie的实现原理1. 客户端请求服务器2. 服务器响应请求3. 再次请求时,客户端请求中会包含一个Cookie请...
    99+
    2024-04-02
  • Dubbo原理和机制详解(非常全面)
    Dubbo是一款Java RPC框架,致力于提供高性能的RPC远程服务调用方案。Dubbo 作为主流的微服务框架之一,为开发人员带来了非常多的便利。 本文我们重点详解 Dubbo 的原理机制 @mikechen 目录 Dubbo核心功能D...
    99+
    2023-09-12
    dubbo java 分布式 后端 架构
  • MySQL时间戳的原理与实现机制解析
    MySQL时间戳的原理与实现机制解析 在MySQL数据库中,时间戳(Timestamp)是一种用于存储日期和时间信息的数据类型。它可以记录时间戳的秒数,精确到微秒级别,用于在数据库中记...
    99+
    2024-03-15
    mysql 时间戳 实现
  • 深入理解 PHP Stream 的工作原理
    PHP Stream 是 PHP 内置的一个重要特性,它提供了灵活的文件读写操作,允许 PHP 脚本以各种方式操作输入和输出数据流。本文将深入探讨 PHP Stream 的工作原理,并...
    99+
    2024-04-02
  • Semaphore的原理和实现方法
    本篇内容介绍了“Semaphore的原理和实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Semaphore数据结构// G...
    99+
    2023-06-15
  • Vue2和Vue3的nextTick实现原理
    目录一次弄懂 Vue2 和 Vue3 的 nextTick 实现原理Vue2 中的 nextTick异步任务队列宏任务和微任务总结Vue3 中的 nextTickPromise 在浏...
    99+
    2023-05-18
    Vue2和Vue3的nextTick实现原理 Vue2 nextTick实现原理 Vue3 nextTick 实现原理
  • 理解cookie和session机制
    cookie和session机制之间的区别与联系...
    99+
    2023-06-03
  • NodeJS实现单点登录原理解析
    目录什么是单点登录单点登录原理NodeJS 演示三个不同的服务首次访问跳转至登录页应用A判断登录态,跳转到SSO认证服务器认证服务器判断登录态,渲染登录页校验用户信息,创建令牌从认证...
    99+
    2024-04-02
  • 如何理解并实现索引的原理和优化
    这篇文章主要讲解了“如何理解并实现索引的原理和优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解并实现索引的原理和优化”吧!Part1为什么Kafk...
    99+
    2024-04-02
  • JAVA中实现原生的 socket 通信机制原理
    本文介绍了JAVA中实现原生的 socket 通信机制原理,分享给大家,具体如下:当前环境jdk == 1.8知识点 socket 的连接处理 IO 输入、输出流的处理 请求数据格式处理 请求模型优化场景今天,和大家聊一下 JAVA...
    99+
    2023-05-31
    java socket 通信
  • 深入理解spring的AOP机制原理
    前言在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题。AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为...
    99+
    2023-05-31
    spring aop sprin
  • Android Adapter机制和原理是什么
    Android Adapter机制是一种将数据与视图之间进行绑定的机制,用于在Android应用中将数据呈现给用户。Adapter负...
    99+
    2023-09-26
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作