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流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nodejs教程之制作一个简单的文章发布系统

    nodejs教程之制作一个简单的文章发布系统

    本文主要讲述了使用nodejs制作一个简单的文章发布系统,使用mongodb数据库,时间比较紧,功能做的也比较简单,仅仅是增删改查,外加附近上传,有相同需求的小伙伴可以参考下
    2014-11-11
  • 浅谈Node模块系统及其模式

    浅谈Node模块系统及其模式

    本篇文章主要介绍了浅谈Node模块系统及其模式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • NodeJS使用递归算法和遍历算法来遍历目录的方法

    NodeJS使用递归算法和遍历算法来遍历目录的方法

    遍历目录是操作文件时的一个常见需求,比如写一个程序,需要找到并处理指定目录下的所有JS文件时,就需要遍历整个目录,NodeJS遍历目录可以使用递归算法、遍历算法,遍历算法又分为同步遍历、异步遍历两种,本文介绍NodeJS使用递归算法和遍历算法来遍历目录的方法
    2023-11-11
  • node搭建后台的实现步骤

    node搭建后台的实现步骤

    本文介绍了使用Node.js搭建后台的实现步骤,文章详细阐述了每个步骤的实现过程,并给出了示例代码,对于想要了解如何使用Node.js搭建后台的读者具有一定的参考价值
    2023-08-08
  • nodejs多版本管理总结

    nodejs多版本管理总结

    这篇文章主要介绍了nodejs多版本管理的相关知识点,以及实际操作方法和代码,有需要的朋友参考下。
    2018-04-04
  • node.js中的fs.rmdir方法使用说明

    node.js中的fs.rmdir方法使用说明

    这篇文章主要介绍了node.js中的fs.rmdir方法使用说明,本文介绍了fs.rmdir方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 使用npm安装最新版本nodejs

    使用npm安装最新版本nodejs

    本文给大家分享的是如何使用npm安装最新版本nodejs的方法,主要用到了nodejs版本管理模块n,非常的好用,有需要的小伙伴可以参考下
    2018-01-01
  • 为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置

    为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置

    这篇文章主要介绍了为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 浅谈express.js框架中间件(middleware)

    浅谈express.js框架中间件(middleware)

    这篇文章主要介绍了浅谈express.js框架中间件(middleware),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • express文件上传中间件Multer详解

    express文件上传中间件Multer详解

    multer是express官方推荐的文件上传中间件,它是在busboy的基础上开发的。目前multer的最新版本为:~1.1.0。本文将详细介绍express文件上传中间件Multer的安装与使用等,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10

最新评论