nodejs使用PassThrough流进行数据传递合并

news2024/12/24 5:52:17

在Node.js中,流(stream)是处理数据的强大工具,它们允许我们以流式方式处理大量数据,而不必一次性将所有数据加载到内存中。PassThrough是Node.js中的一个流类型,它在数据流传递过程中起到 无操作 的中间层,将数据从可读流传递到可写流,同时不做任何修改或处理。本文将介绍PassThrough流的作用、适用场景以及提供一个示例来演示如何使用它。

Node.js PassThrough流

一、什么是PassThrough流?

PassThrough流是Node.js中的一种双工流(duplex stream),既可以读取数据,又可以写入数据。然而,与其他流不同的是,PassThrough流不会对数据进行任何更改,只是简单地将从可读流传递来的数据传输到可写流。它通常在需要将数据从一个流传递到另一个流的情况下使用,而无需对数据进行额外的处理。

二、PassThrough流示例场景

  1. 日志文件流处理:

假设我们正在构建一个应用程序,并需要同时将日志消息写入文件和输出到控制台。我们可以使用PassThrough流来创建一个中间层,将日志消息从应用程序写入流中,然后将其传递到文件流和控制台流,实现日志记录的同时不需要额外的数据处理。

'use strict';

const fs = require('fs');
const { PassThrough } = require('stream');

// 创建一个 PassThrough 流作为中间层
const logStream = new PassThrough();

// 创建一个文件可写流,将日志写入到文件中
const fileStream = fs.createWriteStream('app.log');
logStream.pipe(fileStream);

// 将日志信息输出到控制台
logStream.on('data', (chunk) => {
  console.log('Log:', chunk.toString());
});

// 模拟写入日志
logStream.write('This is a log message.\n');
logStream.write('Another log message.\n');
logStream.end();
  1. shell脚本执行日志,输出流合并:

这里以 Egg.js 服务为例,在内存中创建一个中间缓存 PassThrough 流,然后把 shell 脚本执行的 stdoutstderr 输出流写入到这个中间缓存中,最后将这个中间缓存流通过接口返回。演示代码如下:

'use strict';

const Controller = require('egg').Controller;
const { createReadStream } = require('fs');
const { join } = require('path');
const { spawn } = require('child_process');
const { PassThrough } = require('stream');

class HomeController extends Controller {

  async testStream() {
    ctx.set('Content-Type', 'text/plain; charset=utf-8');

    const shPath = join(__dirname, './test.sh');
    const childProcess = spawn('sh', [ shPath ]);
    
    // 创建内存中的可读写流
    const memoryStream = new PassThrough();

    // 将子进程的 stdout 输出流写入内存流
    childProcess.stdout.pipe(memoryStream);

    // 将子进程的 stderr 输出流写入内存流
    childProcess.stderr.pipe(memoryStream);
    
    ctx.body = memoryStream;
  }

}

module.exports = HomeController;

三、总结

PassThrough 流是Node.js中流模块的有用组成部分,它在数据流传递过程中起到中间层的作用。通过在适当的场景中使用 PassThrough 流,我们可以轻松地将数据从一个流传递到另一个流,同时保持数据的原样性。无论是日志记录还是其他类似的数据传递需求,PassThrough 流都可以为我们提供一种简单而有效的解决方案。


欢迎访问:天问博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/904941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…

设计模式——里氏替换原则

文章目录 里氏替换原则OO 中的继承性的思考和说明基本介绍一个程序引出的问题和思考解决方法 里氏替换原则 OO 中的继承性的思考和说明 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的…

Web会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,…

线性代数的学习和整理6:向量和矩阵详细,什么是矩阵?(草稿-----未完成)

43 矩阵 4.1 矩阵 4 整理网上总结一些 关于直击线性代数本质的 观点 矩阵的本质是旋转和缩放 矩阵里的数字0矩阵里的数字1,表示不进行缩放矩阵里的数字2等,表示缩放矩阵里的数字-3 表示缩放-3倍,并且反向矩阵里的数字的位置矩阵拆分为列向量…

学C的第三十四天【程序环境和预处理】

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十三天【C语言文件操作】_高高的胖子的博客-CSDN博客 1 . 程序的翻译环境和执行环境 在ANSI C(C语言标准)的任何一种实现中,存在两个不同的环境。 &#xff0…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C) Baumer工业相机Baumer工业相机的Bufferlist序列功能的技术背景CameraExplorer如何查看相机Bufferlist功能在BGAPI SDK里通过函数设置相机Bufferlist参数 Baumer工业相机通过BGAP…

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 btree树…

深度学习|自监督学习、MAE学习策略、消融实验

前言:最近在阅读论文,发现太多机器学习的知识不懂,把最近看的一篇论文有关的知识点汇总了一下。 自监督学习、MAE学习策略、消融实验 自监督学习MAE学习策略消融实验 自监督学习 Pretrain-Finetune(预训练精调)模式&…

从LeakCanary看如何判断对象被回收

前面已经了解了Service,Fragment,ViewModel对象的销毁时机,那么在触发销毁时机后,我们怎么判断这些对象有没有回收呢? 大家都知道在Java中有强引用,弱引用,软引用,虚引用四种引用方…

2、手写模拟Spring底层原理

创建BeanDefinition bean定义 设置BeanDefinition 的类信息,作用域信息 创建beanDefinitionMap scope为原型: scope为单例: 总结: 扫描ComponentScan注解上的包扫描路径,将Component注解修饰的类,生成Bea…

数据结构之并查集

并查集 1. 并查集原理2. 并查集实现3. 并查集应用3.1 省份数量3.2 等式方程的可满足性 4. 并查集的优缺点及时间复杂度 1. 并查集原理 并查表原理是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0…

Apache Doris 极简运维之BE扩缩容(1)

Apache Doris 极简运维之BE扩缩容(1) 一、环境信息硬件信息软件信息 二、缩容2.1 DROP BACKEND缩容2.2 DECOMMISSION BACKEND缩容2.2.1 缩容前2.2.2 缩容中2.2.3 缩容后 三、扩容3.1 扩容前3.2 扩容中3.3 扩容后 四、总结 一、环境信息 已部署三个BE节点…

十二、Linux如何修改文件/文件夹所属用户or用户组?chown命令

目录 1、基础语法 2、修改目标用户: 3、修改用户组: 4、使用-R命令,并同时修改用户/用户组 1、基础语法 chown [-R] [目标用户][:][目标用户组] 被修改文件/文件夹 (1)选项-R:同chmod,对文…

Yellowbrick新手入门简介:用于Python机器学习模型可视化的工具库

Yellowbrick 是一个新的 Python 库,它扩展了 Scikit-Learn API,将可视化合并到机器学习工作流程中。 Yellowbrick需要依赖诸多第三方库,包括Scikit-Learn,Matplotlib,Numpy等等。 Yellowbrick 是一个开源的纯 Python…

resource doesn‘t have a corresponding Go package.

resource doesnt have a corresponding Go package. GO这个鬼东西不能直接放src下。 ************ Building Go project: ProjectGoTest ************with GOPATH: D:\Go;D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\ProjectGoTest >> Running: D:\Go\bin\go.exe …

项目管理实战笔记1:项目管理常识

序 看了下极客时间的《项目管理实战》,觉得跟之前学习PMP的标准资料还是有所侧重。重新整理下,相比书上繁杂的知识,这个更通俗易懂。 1 角色转换:三大误区 误区1:事必躬亲 自己做事情是可控的,做项目依赖…

树莓派第一讲:入门那些事(系统烧录、外设连接)

目录 基本了解: 系统烧录: 连接外设: 基本了解: 树莓派4B是一款单板计算机,采用ARM架构处理器,配备4GB内存、Gigabit以太网口、多个USB接口、HDMI输出接口等。它具备1.5Ghz运行的64位四核处理器&#x…

通过安全日志读取WFP防火墙放行日志

前言 之前的文档中,描写了如何对WFP防火墙进行操作以及如何在防火墙日志中读取被防火墙拦截网络通讯的日志。这边文档,着重描述如何读取操作系统中所有被放行的网络通信行为。 读取系统中放行的网络通信行为日志,在win10之后的操作系统上&am…

vmware17 开启虚拟化

前言 有时候需要在虚拟机上安装虚拟机,方便做一些测试 解决办法 在vmware17 上对虚拟机开启虚拟化即可 下图中都勾上即可 设置完成之后就可以在虚拟机上安装虚拟机

【LLM评估篇】Ceval | rouge | MMLU等指标

note 一些大模型的评估模型:多轮:MTBench关注评估:agent bench长文本评估:longbench,longeval工具调用评估:toolbench安全评估:cvalue,safetyprompt等 文章目录 note常见评测benchm…