Node中的streams流的具体使用

 更新时间:2022年02月22日 15:13:56   作者:前端那些年  
本文主要介绍了Node中的streams流的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Node中的streams流

streams流是Node中的最好的特性之一。它在我们的开发过程当中可以帮助我们做很多事情。比如通过流的方式梳理大量数据,或者帮我们分离应用程序。

和streams流相关的内容有哪些呢?大致有这么几点:

  • 处理大量数据
  • 使用管道方法
  • 转换流
  • 读写流
  • 解耦I/O

转换流

Node中的流其实是允许我们进行异步编程的。最常见的就是转换流,它就像是一个接收输入并且产生输出的大黑盒子。

举个例子:

const through = require('through2')
const upper = through((chunk, enc, cb) => {
  cb(null, chunk.toString().toUpperCase())
})

process.stdin.pipe(upper).pipe(process.stdout)

执行它,我们在终端输入的内容,它会转换成大写并且重新输出到终端。

through2模块在核心流的构造器上又加了一层。当我们创建upper时,我们给through传了一个回调函数进去,这个回调函数就是转换方法。流中的每段数据都将通过这个方法,chunk表示数据,enc表示数据的编码格式,cb是一个回调函数,我们执行它表示我们已经完成了数据处理,并且进行下一步处理。

使用through2模块进行处理数据,一方面可读性更强,另一方面,可以保持Node版本之前的行为一致。

创建

大多数情况下,当我们使用核心模块时,我们会直接使用。例如:

const fs = require('fs')
const stream = require('stream')

但是经验告诉我们:不要直接使用核心流模块。我们可以使用readable-stream,虽然名字不一样,但是这确实可以保证我们在不同的Node版本之间保持很好的一致性。所以在代码中我们应该尽可能的使用readable-stream

const stream = require('readable-stream')

看这个例子:

const stream = require('readable-stream')
const util = require('util')

function MyTransform(opts){
  stream.Transform.call(this,opts)
}

util.inherits(MyTransform,stream.Transform)

MyTransform.prototype._transform = function(chunk,enc,cb){
  cb(null,chunk.toString().toUpperCase())
}

const upper = new MyTransform()
process.stdin.pipe(upper).pipe(process.stdout)

在Node的早期版本中,这是创建流的标准方式。但是es6出现以后,有一种更简单的方法。

const {Transform} = require('readable-stream')

class MyTransform extends Transform {
  _transform(chunk,enc,cb){
    cb(null,chunk.toString().toUpperCase(),)
  }
}
const upper = new MyTransform()
process.stdin.pipe(upper).pipe(process.stdout)

对象模式

如果我们的流不是返回的序列换的数据,一般是buffer或者string,我们需要将它转换成一个对象。但是我们需要知道具体传了多少数据过来。

默认情况下,当不使用对象模式时,流将在暂停前缓冲大约16KB的数据。使用对象模式时,当缓冲了16个对象后,它将开始暂停。

再来看一个例子:

const through = require('through2')
const ndjson = require('ndjson')

const xyz = through.obj(({ x, y }, enc, cb) => {
  cb(null, { z: x + y })
})

xyz.pipe(ndjson.stringify()).pipe(process.stdout)

xyz.write({ x: 199, y: 3 })

xyz.write({ x: 10, y: 12 })

这个例子会打印下面的结果

我们用through2模块的obj方法创建了一个流。然后通过pipe方法write的信息进行stringify然后再传给process.stdout,最后返回了计算后的结果。

我们也可以使用readable-stream模块来实现这个:

const {Transform} = require('readable-stream')
const {serialize} = require('ndjson')
const xyz = Transform({
  objMode:true,
  transform:({x,y},enc,cb)=>{
    cb(null,{z:x+y})
  }
})
xyz.pipe(ndjson.stringify()).pipe(process.stdout)

xyz.write({ x: 199, y: 3 })

xyz.write({ x: 10, y: 12 })

同样可以实现上面的效果。

最后

到此这篇关于Node中的streams流的具体使用的文章就介绍到这了,更多相关Node streams流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)

    Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)

    这篇文章主要介绍了Node.js中使用Log.io在浏览器中实时监控日志,Log.io等同于tail -f命令,但更强大,需要的朋友可以参考下
    2014-09-09
  • 整理 node-sass 安装失败的原因及解决办法(小结)

    整理 node-sass 安装失败的原因及解决办法(小结)

    这篇文章主要介绍了整理 node-sass 安装失败的原因及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Egret引擎开发指南之运行项目

    Egret引擎开发指南之运行项目

    Egret Framework是一款使用TypeScript语言构建的开源免费的移动游戏框架。Egret Framework的核心定位是开放,高效,优雅。通过它,你可以快速地创建HTML5类型的移动游戏,也可以将游戏项目编译输出成为目标移动平台的原生游戏应用。
    2014-09-09
  • 基于promise.js实现nodejs的promises库

    基于promise.js实现nodejs的promises库

    promise是JavaScript实现优雅编程的一个非常不错的轻量级框架。该框架可以让你从杂乱的多重异步回调代码中解脱出来,并把精力集中到你的业务逻辑上。
    2014-07-07
  • Express.JS使用详解

    Express.JS使用详解

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。下面我们将逐步分析下,各位不要轻易离开
    2014-07-07
  • Nodejs sublime text 3安装与配置

    Nodejs sublime text 3安装与配置

    Sublime Text是一个轻量、简洁、高效、跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点博得了很多前端开发人员的喜爱!Sublime Text这款程序员必备代码编辑器,几乎每位程序员提到Sublime Text都是赞不绝口!它体积小巧,无需安装,绿色便携
    2014-06-06
  • 一步步教你利用Docker设置Node.js

    一步步教你利用Docker设置Node.js

    这篇文章主要介绍了利用Docker设置Node.js的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Nodejs实现获取实时数据的三种主流方式详解

    Nodejs实现获取实时数据的三种主流方式详解

    这篇文章主要为大家详细介绍了Nodejs前端获取实时数据的三种主流方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Node.js使用Middleware中间件教程详解

    Node.js使用Middleware中间件教程详解

    中间件(Middleware),特指业务流程的中间处理环节,Express中间件的调用流程-当一个请求处理时,可以连续调用多个中间件,从而对这次请求进行预处理
    2023-04-04
  • NodeJS远程代码执行

    NodeJS远程代码执行

    这篇文章主要介绍了NodeJS远程代码执行方法的相关资料,需要的朋友可以参考下
    2016-08-08

最新评论