首页 > 编程语言 >NodeJs through处理流

NodeJs through处理流

时间:2023-04-26 15:03:26浏览次数:44  
标签:process through2 NodeJs 处理 chunk pipe callback through push

through2主要是基于streams2(2指的是API稳定性)封装的transform stream。其内部仅是封装了Transform的构造函数,以及更为易用的objectMode模式。

through2并未引用node默认提供的stream模块,而是使用社区中较为流行的readable-stream模块,主要是为了对之前node版本做了兼容支持。

我们可以先看一段关于transform stream使用的基本示例:

const { Transform } = require('stream');

const upperCaseTr = new Transform({
  transform(chunk, encoding, callback) {
    // 转换为大写、push到可读流
    this.push(chunk.toString().toUpperCase());
    callback();
  }
});

process.stdin.pipe(upperCaseTr).pipe(process.stdout);

对应的如果换成through2写法。

process.stdin.pipe(through2(function(chunk, enc, callback) {
  this.push(chunk.toString().toUpperCase())
  callback()
})).pipe(process.stdout);

接下来我们再看看对象模式,默认地,stream除了接收 Buffer/String 值。还有一个对象模式(objectMode)的标识,我们可以设置以接受任意Javascript 对象。

const { Transform } = require('stream');
const commaSplitter = new Transform({
  readableObjectMode: true,
  transform(chunk, encoding, callback) {
    this.push(chunk.toString().trim().split(','));
    callback();
  }
});
const arrayToObject = new Transform({
  readableObjectMode: true,
  writableObjectMode: true,
  transform(chunk, encoding, callback) {
    const obj = {};
    for(let i=0; i < chunk.length; i+=2) {
      obj[chunk[i]] = chunk[i+1];
    }
    this.push(obj);
    callback();
  }
});
const objectToString = new Transform({
  writableObjectMode: true,
  transform(chunk, encoding, callback) {
    this.push(JSON.stringify(chunk) + '\n');
    callback();
  }
});
process.stdin
  .pipe(commaSplitter)
  .pipe(arrayToObject)
  .pipe(objectToString)
  .pipe(process.stdout)

我们在终端输入:

$ a,b,c,d
$ {"a":"b","c":"d"}

对应的如果换成through2写法。

process.stdin
  .pipe(through2.obj(function (chunk, enc, callback) {
    this.push(chunk.toString().trim().split(','));
    callback();
  }))
  .pipe(through2.obj(function (chunk, enc, callback) {
    const obj = {};
    for(let i=0; i < chunk.length; i+=2) {
      obj[chunk[i]] = chunk[i+1];
    }
    this.push(obj);
    callback();
  }))
  .pipe(through2.obj(function (chunk, enc, callback) {
    this.push(JSON.stringify(chunk) + '\n');
    callback();
  }))
  .pipe(process.stdout)

 pipe中间进行处理

var through2  = require('through2');
var stream = through2(write,end)
process.stdin
    .pipe(stream)
    .pipe(process.stdout);

function write(line,_,next){
    this.push(line.toString().toUpperCase())
    next();
})
function end(done){
    done();
})

 

标签:process,through2,NodeJs,处理,chunk,pipe,callback,through,push
From: https://www.cnblogs.com/sttchengfei/p/17356078.html

相关文章

  • Nodejs中流的操作,实现简单的pipe
    fs与流都可以处理文件,为什么还要用流?fs模块处理文件的缺点:将文件的数据全读到内存中,在把数据写到文件内,会大量占用内存。流介绍:      流(stream)是Node.js中处理流式数据的抽象接口,是一组有序的,有起点和终点的字节数据传输手段。可以实现将数据从一个地方流动到另一个......
  • 16异常处理
    异常处理异常异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。捕获异常异常类型捕获#捕......
  • mysql处理CVE-2023-21912漏洞
    目录背景解决办法系统现状思考升级过程(离线)1.查看Centos版本2.查看数据库版本3.数据库离线下载地址4.解压安装包5.停止mysql服务5.备份数据库文件6.卸载当前数据库版本7.本地安装8.启动mysql辅助操作查看含有mysql文件路径查找mysql配置文件查看文件占用大小当前目录查......
  • SpringSecurity从入门到精通:从数据库查询权限信息&自定义失败处理
    从数据库查询权限信息      记得打开redis      自定义失败处理我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity......
  • SpringBoot2 hikari关于 Failed to validate connection com.mysql.cj.jdbc.Connectio
    项目启动不报错,如果静默15分钟没有数据库操作就报上述错误WARN不影响程序运行Failedtovalidateconnectioncom.mysql.cj.jdbc.ConnectionImpl@16244d67(Nooperationsallowedafterconnectionclosed.).PossiblyconsiderusingashortermaxLifetimevalue.发现Spri......
  • 从数据库查询权限信息与自定义失败处理
    从数据库查询权限信息代码实现我们只需要根据用户id去查询到其所对应的权限信息即可。​  所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息。packagecom.example.qinghuatokendemo.Mapper;importc......
  • 快速上手Linux核心命令(五):文本处理三剑客
    @目录前言正则表达式第一剑客grep第二剑客sed第三剑客awk小结剑仙镇楼~O(∩_∩)O前言上一篇中已经预告,我们这篇主要说Linux文本处理三剑客。他们分别是grep、sed、awk。既然能被业界称为三剑客,可见其在Linux命令中占有举足轻重得地位。所以呢,这里也专门写一篇文章说一说......
  • lazarus - Free Pascal 之 文件处理
    今儿来写写如何使用FreePascal处理文件,感觉挺有用的任务一:写helloworld到文件1procedureTForm1.Button1Click(Sender:TObject);2var3f:TextFile;4begin5AssignFile(f,'hello.txt');6ReWrite(f);7Write(f,'helloworld');8CloseFile(f);9......
  • 研究生论文处理的数据
    数据的特征是反射率每一个波长代表一个维度。数据的横轴代表像素数,纵轴代表不同频率,里面的内容表示不同频率的反射率。物体反射的辐射能量占总辐射能量的百分比,称为反射率。不同物体的反射率也不同,这主要取决于物体本身的性质(表面状况),以及入射电磁波的波长和入射角度,反射率的大......
  • 音频处理库性能对比:计算mel频谱的速度哪个更快?
    介绍音频信号处理在各种应用中都发挥着重要的作用,如语音识别、音乐信息检索、语音合成等。其中,Mel频谱是一种常用的频域特征表示方法,用于描述人类听觉系统对频率的敏感程度。在深度学习音频领域,mel频谱是最常用的音频特征。在本文中,我们将对四个常用的音频处理库——audioflux、......