根据心情整理一些node的api~

今天第一篇,node的流;node的流比较重要,node的流存在于node的各个模块,包括输入输出流,stdin,stout。fs读取流,zlib流,crypto流,tcp套接字等等,node很重要的net,http模块都用到了流的概念,留到以后再说。还有gulp的流也是来源于node的流。express的中间件,也被应用于各大框架……


nodejs流,所有流都是EventEmitter的实例,流包括了Readable,writable,Duplex,Transform流;这是流的分类。

Stream,数据出自一个readable流,在就绪接受之前,readable流不会发生数据。
readable流有流动模式和暂停模式(默认)两种模式;处于暂停模式时,必须明确调用stream.read()取出若干数据块。

如果没有绑定data事件处理,也没有pipe()目标,处于流动模式,数据会流失
 ·some ways change to流动模式

1,添加一个data事件监听
2,调用resume()开启数据流
3,调用pipe()将数据发送到一个writable
some ways  change to暂停模式
1,如果没有导流目标,调用pasuse()
2,如果有导流弥补,移出所有data监听器,调用unpipe()移除所有导流目标
tips:移出data监听器并不会暂停流,当有导流目标时,调用pause()并不能保证流在哪些目标排空并请求更多数据时维持暂停状态

一些可读流的例子:

客户端上的http响应
服务器上的http请求
fs读取流
zlib流
crypto流
tcp嵌套字
子进程的stdout和stderr

流的事件:

//readable事件
当一个数据块可以从流中被读出,会触发一个readable事件

var readable=getReadableStreamSomehow();
readable.on('readable',function(){
//有数据可读
})

//data事件

var readable=getReadableStreamSomehow();
readable.on('data',function(chunk){
   console.log('得到了%d字节的数据',chunk.length);
  })

后面node好多模块都可以监听data来接收事件,比如http的server,也可以用pipe()传数据给客户端。

//end事件
在没有更多数据能提供时被触发;在数据被完全消费之前不会被触发,
// close事件底层数据源被关闭时触发,不是所有流都会触发
//error事件数据接收错误触发
//readable.read([size])

read()从内部缓存区中拉取返回若干数据,没有更多数据时会返回null,指定size会返回相当字节的数据
仅在暂停模式时被调用

var readable=getReadableStreamSomehow();
readable.setEncoding('utf8')
readable.on('readable',function(){
var chunk;
while(null!==(chunk=readable.read())){
console.log('得到了%d字节的数据',chunk.length);
}
})

  

//readable.setEncoding(encoding)
//readable.resume()返回this可以让可读流继续触发data事件
//readable.pause()让处于流动模式的流停止触发data事件,切换到非流动模式,并让都需可用数据留在内部缓冲区
//readable.pipe(destination,[options])写入数据的目标;导流选项options,end在读取者结束时结束写入者,缺省为true
=>可以从可读流中拉取所有数据,并写入到所提供的目标,该方法能自动控制流量以避免目标被快速读取的可读流淹没

var readable=getReadableStreamSomehow();
var writable=fs.createWriteStream('files.txt');
readable.pipe(writable);//返回目标流

//readable.unpipe()就不说了-0-前面提到了。

nodejs的某些api~(一)node的流1的更多相关文章

  1. Node.js流

    什么是流? 流是可以从一个源读取或写入数据到连续的目标对象.在Node.js,有四种类型的数据流. Readable - 其是用于读操作. Writable - 用在写操作. Duplex - 其可以 ...

  2. vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版

    vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版 vuejs技术交流QQ群:458915921 有兴趣的可以加入 vuejs 目录结构 build build.js check ...

  3. nodejs的某些api~(四)udp&dns

    今天记udp/数据报套接字和dns. udp UDP/数据报套接字 => require('dgram');dgram.createServer([type],[cb]);type:可以是'ud ...

  4. nodejs备忘总结(一) -- node和express安装与配置,新建简单项目(附安装配置过程中遇到问题的解决方法)

    安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环 ...

  5. ASP.NET Web Api vs Node.js Benchmark

    http://mikaelkoskinen.net/post/asp-net-web-api-vs-node-js-benchmark ASP.NET Web Api vs Node.js Bench ...

  6. nodejs的某些api~(一)node的流2

    可写流writablewritable.write(chunk, [encoding], [callback])chunk {String | Buffer} 要写入的数据encoding {Stri ...

  7. Node与apidoc的邂逅——NodeJS Restful 的API文档生成

    作为后台根据需求文档开发完成接口后,交付给前台(angular vue等)做开发,不可能让前台每个接口调用都去查看你的后台代码一点点查找.前台开发若不懂你的代码呢?让他一个接口一个接口去问你怎么调用, ...

  8. node api 之:stream - 流

    stream 模块可以通过以下方式使用: const stream = require('stream'); 流可以是可读的.可写的.或者可读可写的. 所有的流都是 EventEmitter 的实例. ...

  9. nodejs的某些api~(五) HTTP模块

    HTTP的模块是nodejs最重要的模块(应该是),最近在看HTTP权威指南,重新过了一遍http协议和web客户端.再来看这个http. HTTP构建于TCP之上,属于应用层协议,继承自tcp服务器 ...

随机推荐

  1. SQLServer数据库分页

    以  项目表 PM_Project  为例. PM_Project 全部内容如下(共6条数据): 一.Top – Not In - Top 方式分页 直接的,原始的,不采用函数,纯手动挡. 分步探索过 ...

  2. 【翻译】asp.net core2.1认证和授权解密

    asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...

  3. [转帖]nginx服务器安装及配置文件详解

    nginx服务器安装及配置文件详解 http://seanlook.com/2015/05/17/nginx-install-and-config/  发表于 2015-05-17 |  更新于: 2 ...

  4. 1065. 我的日程安排表 I

    描述 实现MyCalendar类来存储您的活动. 如果新添加的活动没有重复,则可以添加. 你的类将有方法book(int start,int end). 这代表左闭右开的间隔[start,end)有了 ...

  5. 50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)

    转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 50分钟学会Laravel 50个小技巧 原文链接:< 50 Laravel Tricks in 50 Mi ...

  6. WIndows下使用Grafana+InfluxDB打造监控系统

     前言 对于一个运维DBA来说,了解数据库的TPS.QPS很有必要(QPS:每秒查询数,即对数据库每秒的DML的操作数:TPS:每秒事物处理,即对数据库每秒DDL操作数),通过了解他们,可以掌握一个实 ...

  7. C# Note24: 指针的使用

    C#为了类型安全,默认并不支持指针.但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式.在不安全模式下,我们可以直接操作内存,这样就可以使用 ...

  8. 对于修改jsp页面后页面不发生变化的解决方法

    1.清除 Tomcat 6.0\work\Catalina\localhost 里面这个工程的内容:2.清除 Tomcat 6.0 webapps 里面的这个工程内容,然后重新部署,重启服务器:3.清 ...

  9. scala下划线

    作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...

  10. h5简易手写板

    ............. 我该说点什么呢,开头居然不知道想说点什么!好吧不知道说什么,我们就来说说这个手写板吧,虽然这个手写板现在没什么用,但是.....,好像的确没什么用啊! 只是存粹哪里练手的的 ...