流是Nodejs的高级应用,掌握流的使用,才能真正胜任NodeJS开发。

Nodejs中,流是基于事件的API,用于管理和处理数据,而且效率很好!

什么是流?

流是一个抽象接口,Node 中有很多对象实现了这个接口。

例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)等。

流的四种类型

dable - 可读操作。

Writable - 可写操作。

Duplex - 可读可写操作.

Transform - 操作被写入数据,然后读出结果。

流的事件

所有的流对象都是 EventEmitter 的实例,流常用的事件有:

data - 当有数据可读时触发。

end - 没有更多的数据可读时触发。

error - 在接收和写入过程中发生错误时触发。

finish - 所有数据已被写入到底层系统时触发。

什么时候使用流?

举例说明:

1、当使用fs.readFileSync同步读取一个文件的时候,所有的数据会被全部读到内存中,这个操作过程中程序会被阻塞。

2、如果使用fs.readFile,由于它是异步方法,那么阻塞不会发生,但数据仍会被全部读到内存中再处理。

当处理大文件压缩、媒体文件等的时候,无疑会很吃力。那么这时,就是使用流的时候了。

3、流会将分批次的读取适量的内容到缓存区进行操作,而不是一次性读取所有目标内容。

这样,程序对内存的使用量会极大减少、执行性能会提升很多:

举例说明,使用流的优势

先使用node内置的核心模块http实现一个简单的静态web服务器:

var http = require("http");
var fs = require("fs");

http.createServer(function(req,res){
    fs.readFile(__dirname + "/test10.js",function(err,data){
        if(err){
            res.statusCode = 500;
            res.end(String(err));
        }else{
            res.end(data);
        }
    })
}).listen(8000);

这段代码使用非阻塞的fs.readfile的方法。

当被访问时,读取文件内容(代码中读取的是本举程代码)并发送给访问者。

测试访问,效果:

可能说,功能并无问题。但如果被读取的文件test10.js文件非常大呢。就会有效率问题。

这时,可以改用流的方式:

注意图中标识出的内容,是修改的内容:使用流的方式读取,通过管道(pipe)传给res。

var http = require("http");
var fs = require("fs");

http.createServer(function(req,res){

    fs.createReadStream(__dirname+"/test10.js").pipe(res);

}).listen(8000);

执行效果一样,但对内存的使用得到优化,性能得到提升。

同时,代码也更简洁。

流不仅高效优雅,扩展性也更强。比如对上面的代码稍做改动,就可以实现gzip压缩传输数据,可以使网页打开更快。

var http = require("http");
var fs = require("fs");
var zlib = require("zlib");

http.createServer(function(req,res){

    res.writeHead(200,{"content-encoding":"gzip"});

    fs.createReadStream(__dirname+"/test10.js").pipe( zlib.createGzip() ).pipe(res);

}).listen(8000);

从浏览器信息中可以看到,内容已启用gzip压缩。

Node.js实战10:“流”是Node.js最强大的功能之一。的更多相关文章

  1. Node.js实战(四)之调试Node.js

    当项目逐渐扩大以后,功能越来越多,这时有的时候需要增加或者修改,同时优化某些功能,就有可能出问题了.针对于线上Linux环境我们应该如何调试项目呢? 别怕,Node.js已经为我们考虑到了. 通过 n ...

  2. [Node.js] Node.js中的流

    原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...

  3. 10个最佳Node.js企业应用案例:从Uber到LinkedIn

    译者按: Node.js 8已经发布了,NPM模块每周下载量早已超过10亿,从Uber到LinkedIn都在使用Node.js,谁说JavaScript不能写后台? - 原文: 10 best Nod ...

  4. 《Node.js实战(双色)》作者之一——吴中骅访谈录

  5. Node.js v0.10.31API手冊-控制台

    Node.js v0.10.31API手冊-文件夹 控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出 ...

  6. Node.js v0.10.31API手冊-事件

    Node.js v0.10.31API手冊-文件夹 Events(事件) Node里面的很多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStrea ...

  7. Node.js v0.10.31API手工-DNS

    原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...

  8. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  9. Node.js实战项目学习系列(1) 初识Node.js

    前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...

随机推荐

  1. intel RDT技术管理cache和memory_bandwidth

    主页:https://www.intel.com/content/www/us/en/architecture-and-technology/resource-director-technology. ...

  2. GUI学习之二十五——QFontDialog学习总结

    今天学习字体对话框——QFontDialog()控件. QFontDialog()是继承自QDialog()的一个子类,用来选择给定的字体(包括字体.字号.样式等) 一.构造函数 QFontDialo ...

  3. git log 详解 以及代码量统计

    https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86% ...

  4. Python 基本数据类型详解

    1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647在64位系统上,整数的位数为64位,取值范围为-2* ...

  5. Spring Cloud(1)相关概念

    单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N个子 ...

  6. python入门 python字符串换行显示、字符串太长\连接多行

    #coding:utf-8#/usr/bin/python"""2018-11-03dinghanhua缩进换行""" "&quo ...

  7. IDEA提交代码到github

    GIT客户端安装及idea配置github账号并提交代码到GIT参考资料:https://blog.csdn.net/qq_31405633/article/details/88193119 1. 选 ...

  8. Java——常用类(基础类型数据包装类)

    [包装类]   包装类(如Integer.Double等)这些类封装了一个相应的基础数据类型数值,并为其提供了一系列操作.     例如:java.lang.Integer类提供了以下构造方法:   ...

  9. input 的type类型值

    input有很多属性,我们先来说一下最原始的,也就是HTML5之前的 1)text: 定义单行的输入字段,可扎起其中输入文本 2)password:定义密码字段,会显示自符掩码 3)file: 定义输 ...

  10. [转载]Android: 如何实现ScrollView中含有ListView?

    原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView ...