广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Node.js中的流(Stream)介绍
  • 201
分享到

Node.js中的流(Stream)介绍

NodejsStream 2022-06-04 17:06:58 201人浏览 独家记忆
摘要

什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在shell中被实现为可以通过 |(管道符) 进行桥接的数据,一个进程的输出(stdout)可被直接作为下一个进程的输入(stdin)

什么是流?

说到流,就涉及到一个*nix的概念:管道——在*nix中,流在shell中被实现为可以通过 |(管道符) 进行桥接的数据,一个进程的输出(stdout)可被直接作为下一个进程的输入(stdin)。

node中,流(Stream)的概念与之类似,代表一种数据流可供桥接的能力。

pipe

流化的精髓在于 .pipe()方法。可供桥接的能力,在于数据流的两端(上游/下游 或称为 读/写流)以一个 .pipe()方法进行桥接。

查看图片

伪代码的表现形式为:

//上游.pipe(下游)

Readable.pipe(Writable);

流的分类

这里并不打算讨论所谓的Node v0.4 之前的“经典”流。那么,流分为这么几类(皆为抽象接口:

1.stream.Readable 可读流(需要实现_read方法,关注点在于对数据流读取的细节
2.stream.Writable 可写流(需要实现_write方法,关注点在于对数据流写入的细节
3.stream.Duplex 可读/写流(需要实现以上两接口,关注点为以上两接口的细节
4.stream.TransfORM 继承自Duplex(需要实现_transform方法,关注点在于对数据块的处理

简单来说:

1).pipe() 的拥有者一定具备 Readable 流(并不局限于)能力,它拥有 'readable'/'data'/'end'/'close'/'error' 一系列事件可供订阅,也提供 .read()/.pause()/.resume()等一系列方法供调用;
2).pipe() 的参数一定具备Writable 流(并不局限于 )能力,它拥有 'drain'/'pipe'/'unpipe'/'error'/'finish' 事件可供访问,也提供 .write()/.end() 等一系列方法供调用

什么鬼

有没有一丝丝焦虑?别急,做为一个说人话的低级码工,我会把Stream掰开了和您扯一扯的。

Stream类,在 node.js源码 里,是这么定义的:

var EE = require('events').EventEmitter;

var util = require('util');

util.inherits(Stream, EE);

 

function Stream() {

  EE.call(this);

}

可以看出,本质上,Stream是一个EventEmitter,那意味着它具备事件驱动的功能(.emit/.on...)。众所周知,“Node.js 就是基于V8的事件驱动平台”,实现了事件驱动的流式编程,具备了和Node一样的异步回调的特征。

比如在 Readable 流中,有一个 readable 事件,在一个暂停的只读流中,只要有数据块准备好可读时,它就会被发送给订阅者(Readable 流有哪些呢?express中的 req,ftp或者mutli-form上传组件的req.part,系统中的标准输入 process.stdin等)。有了readable 事件,我们可以做个处理shell 命令输出的分析器之类的工具

process.stdin.on('readable', function(){

   var buf = process.stdin.read();

   if(buf){

      var data = buf.toString();

      // parsing data ...                                                

   }

});

这样调用:

head -10 some.txt | node parser.js

对于 Readable 流,我们还可以订阅它的 data 和 end 事件,以获取数据块并在流枯竭时获得通知,如 经典Socket示例 中那样:

req.on('connect', function(res, socket, head) {

    socket.on('data', function(chunk) {

      console.log(chunk.toString());

    });

    socket.on('end', function() {

      proxy.close();

    });

  });

Readable流状态的切换
需要注意的是,Readable 流有两种状态:flowing mode(激流) 和 pause mode(暂停)。前者根本停不下来,谁被pipe上了就马上不停的给;后者会暂停,直到下游显式的调用 Stream.read() 请求才读取数据块。Readable 流初始化时是 pause mode的。

这两种状态可以互为切换的,其中,

有以下任一行为,pause 转 flowing:

1.对 Readable 流添加一个data事件订阅
2.对 Readable 调用 .resume() 显式开启flowing
3.调用 Readable 流的 .pipe(writable) ,桥接到一个 Writable 流上

有以下任一行为,flowing 转回 pause:

1.Readable 流还没有 pipe 到任何流上,可调 .pause() 暂停
2.Readable 流已经 pipe 到了流上,需 remove 掉所有 data 事件订阅,并且调用 .unpipe()方法逐一解除与下游流的关系

妙用

结合流的异步特性,我可以写出这样的应用:直接将 用户A 的输出桥接到 用户B 的页面上输出:

router.post('/post', function(req, res) {

    var destination = req.headers['destination']; //发给谁

    cache[destionation] = req;

    //是的,并不返回,所以最好是个ajax请求

});

用户B请求的时候:

router.get('/inbox', function(req, res){

    var user = req.headers['user'];

    cache.find(user, function(err, previousReq){ //找到之前存的req

       var form = new multiparty.Form();

       form.parse(previousReq);  // 有文件给我

       form.on('part', function (part) {

            part.pipe(res); //流式大法好:)

 

            part.on('error', function (err) {

                console.log(err);

                messaging.setRequestDone(uniqueID);

                return res.end(err);

            });

        });

    });

});

参考

how to write node programs with streams: stream-handbook

--结束END--

本文标题: Node.js中的流(Stream)介绍

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

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

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

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

下载Word文档
猜你喜欢
  • Node.js中的流(Stream)介绍
    什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现为可以通过 |(管道符) 进行桥接的数据,一个进程的输出(stdout)可被直接作为下一个进程的输入(stdin)...
    99+
    2022-06-04
    Node js Stream
  • node中Stream流的详细介绍
    目录一、是什么二、种类双工流双工流三、应用场景get请求返回文件给客户端文件操作一些打包工具的底层操作一、是什么 流(Stream),是一个数据传输手段,是端到端信息交换的一种方式,...
    99+
    2022-11-13
  • Node.js中的缓冲与流模块详细介绍
    缓冲(buffer)模块 js起初就是为浏览器而设计的,所以能很好的处理unicode编码的字符串,但不能很好的处理二进制数据。这是Node.js的一个问题,因为Node.js旨在网络上发送和接收经常是以二...
    99+
    2022-06-04
    详细介绍 模块 Node
  • Node.js中怎么实现Stream流
    本篇内容主要讲解“Node.js中怎么实现Stream流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中怎么实现St...
    99+
    2022-10-19
  • JDK中Stream代码简洁的新特性介绍
    本篇内容主要讲解“JDK中Stream代码简洁的新特性介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JDK中Stream代码简洁的新特性介绍”吧!一、概述Stream 是一组用来处理数组、集...
    99+
    2023-06-15
  • Node.js中 __dirname 的使用介绍
    前言 本文主要给大家介绍的是关于Node.js中 __dirname 使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 方法如下 新建个文件 app.js 里面的内容如下: conso...
    99+
    2022-06-04
    Node js __dirname
  • Java中IO流的详细介绍
    这篇文章主要介绍“Java中IO流的详细介绍”,在日常操作中,相信很多人在Java中IO流的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中IO流的详细介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • Node.js中流(stream)的使用方法示例
    前言 本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件...
    99+
    2022-06-04
    中流 示例 使用方法
  • Node.js中的模块系统介绍
    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js ...
    99+
    2022-11-13
  • Node.js的包详细介绍
    在Node.js语言中,包和模块并没有本质的不同,包是在模块的基础上更深一步的抽象,包将某个独立的功能封装起来,用于发布、更新、依赖管理和进行版本控制。Node.js根据CommonJS规范实现了包机制,开...
    99+
    2022-06-04
    详细介绍 Node js
  • Linux的启动流程介绍
    这篇文章主要讲解了“Linux的启动流程介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux的启动流程介绍”吧!第一步、加载内核操作系统接管硬件以后,首先读入 /boot 目录下的内...
    99+
    2023-06-06
  • Shell的流程控制介绍
    这篇文章将为大家详细讲解有关Shell的流程控制介绍,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。和Java、PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法):&l...
    99+
    2023-06-09
  • node.js cookie-parser 中间件介绍
    之前加入了一个学习笔记本群,通过学习笔记来分享学习成果。也在这里发一份吧。 当我们在写web的时候,难免会要使用到cookie,由于node.js有了express这个web框架,我们就可以方便地去建站。在...
    99+
    2022-06-04
    中间件 js node
  • Node.js 中的 module.exports 与 exports区别介绍
    目录介绍示例从源码中理解通过示例理解示例一示例二示例三示例四小结介绍 module:每个模块中都有 module 对象,存放了当前模块相关的信息;module.e...
    99+
    2022-11-13
  • Java IO流 - 缓冲流的详细使用介绍
    文章目录 缓冲流缓冲流概述字节缓冲流字符缓存流 缓冲流 缓冲流概述 缓冲流介绍: 缓冲流也称为高效流、或者高级流。之前学习的字节流和字符流可以称为原始流。 作用:缓冲流自带...
    99+
    2023-09-11
    java jvm 算法
  • Java IO流 - 字节流的使用详细介绍
    文章目录 IO流的基本介绍字节流的使用文件字节输入流创建字节输入流每次读取一个字节每次读取一个数组一次读取全部字节 文件字节输出流创建字节输出流写入文件输出流 文件拷贝练习 ...
    99+
    2023-09-16
    java jvm 前端
  • 关于Node.js的events.EventEmitter用法介绍
    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStr...
    99+
    2022-06-04
    js Node EventEmitter
  • MyBatis详细执行流程的介绍
    本篇内容介绍了“MyBatis详细执行流程的介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Mybatis简介MyBatis 是一款优秀的...
    99+
    2023-06-14
  • 最流行的Node.js精简型和全栈型开发框架介绍
    快速开发而又容易扩展,高性能且鲁棒性强。Node.js的出现让所有网络应用开发者的这些梦想成为现实。但是,有如其他新的开发语言技术一样,从头开始使用Node.js的最基本功能来编写代码构建应用是一个非常划...
    99+
    2022-06-04
    最流行 框架 js
  • Stream流中的Map方法
    在Java 8及以上的版本中,Stream中的map方法可以用于对Stream中的每个元素应用一个函数,并将结果存储在一个新的Stream中。具体用法如下: // 创建一个Stream对象Stream stream = ...;// 应用函...
    99+
    2023-08-31
    java 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作