理解nodejs的stream和pipe机制

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前言

前几天别人请教我关于pipe的问题,我发现我虽然用了nodejs很久,但是由于每次用的不多所以经常回避stream的使用,导致一直不熟,现在重新学习整理一下相关知识。

通过nodeschool学习stream

nodeschool有一个stream-adventure教程教导stream的使用,很简单

简单stream进行pipe

首先,我们可以通过管道将输入定位到输出,输入输出可以是控制台或者文件流或者http请求,比如

process.stdin.pipe(process.stdout)
process.stdin.pipe(fs.createWriteStream(path))
fs.createReadStream(path).pipe(process.stdin)

pipe中间进行处理

如果我们想要在管道中间进行处理,比如想将输入的字符串变成大写写到输出里,我们可以使用一些可以作为中间处理的框架,比如through2就很方便

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();
})

stream转化成普通回调

当我们输入是流,而输出是个普通函数,我们需要把输入流转化为普通的buffer,这时可以试用concat-stream库

var concat = require('concat-stream');

var reverseStream=concat(function(text){
    console.log(text.toString().split("").reverse().join(""));
})

process.stdin.pipe(reverseStream)

http server中的流

类似stdin和fs,http由于其特性也适合使用流,所以其自带类似特性

var http = require('http');
var server = http.createServer(function(req,res){
    req.pipe(res);
})

既作为输入也作为输出的流

request框架实现了如下功能,将一个流pipe到request请求中,然后将流的内容发给服务器,然后返回作为流供其他代码使用,实现如下

var request = require('request');
var r = request.post('http://localhost:8099');
process.stdin.pipe(r).pipe(process.stdout)

分支管道

下边是一个例子,这个例子将输入管道中html包含loud class的元素放入另一个管道进行大写操作,然后最后合并成输出

var trumpet = require('trumpet');
var through2 = require('through2');
var fs = require('fs');
var tr = trumpet();
var stream = tr.select('.loud').createStream();
var upper = through2(function(buf,_,next){
    this.push(buf.toString().toUpperCase());
    next();
})
stream.pipe(upper).pipe(stream);
process.stdin.pipe(tr).pipe(process.stdout);

合并输入输出stream例子

合并后的输入输出可像前文request一样使用,下边这个例子实现了使用流的方式进行子进程调用

var spawn = require('child_process').spawn;
var duplexer2 = require('duplexer2');

module.exports = function(cmd, args){
    var c = spawn(cmd,args)
    return duplexer2(c.stdin,c.stdout)
}

总结

通过上边的例子,可以知道stream应该还有如何合并等更复杂的应用方式。总之整体上符合如下特性:

  • Stream分为readable、writeble
  • Stream通过pipe方法控制流向
  • httpServer和httpClient和file system和process.stdin\out\err通常可以作为stream
  • Stream可以被on(event)转化为普通的变量,普通变量可以被write转换成stream
  • Stream自身可以被拆分、合并、过滤
Nodejs 中基于 Stream 的多文件合并实现 本文先从一个 Stream 的基本示例开始,有个初步认识,中间会讲在 Stream 中什么时候会出现内存泄漏,及如何避免最后基于 Nodejs 中的 Stream 实现一个多文件合并为一个文件的例子。 一个简单的 Stream 操作 创建一个可读流 readable 一个可写流 writeable,通过管道 pipe 将可写流绑定到可读流,一个简单的 Stream 操作就完成了。 cons... 阅读详情

相关推荐

Nodejs|面试官:说说对 Node 中的 Stream理解?应用场景?

前端八股文

VAN 637

Node.js中的pipe方法:深入解析与应用指南

在 Node.js 中,pipe方法是一种强大的流(Stream)处理方法,它用于将一个流的输出直接连接到另一个流的输入。这种方法在处理文件读写、网络请求响应等场景中非常有用,因为它可以有效地将数据从一个源头传输到另一个目的地,而无需手动读取写入数据。

1354

详解Nodejs 通过 fs.createWriteStream 保存文件

工作中难免会遇到处理大文件的时候,有这种stream的处理方式,就不需要一次处理太大的文件,从而导致内存不够用,或者内存占用太多。 fs.createWriteStream 似乎不会自己创建不存在的文件夹,所以在使用之前需要注意,保存文件的文件夹一定要提前创建。 const path = '/xxxxxx/ddd/'; if (!fs.existsSync(path)) { fs.mkdirSync(path); } 创建完文件夹,我们就可以进行文件添加操作了。我们希望在使用文件添加操作的时候是通过saveFile(filePath, fileData);这样的方式来调用。 这里我采用了

node读写流以及pipe的使用

在js代码中,如果我们读取数据或者是打印数据,一般是var 或 let 一个变量,再打印出来但是这样的方法需要开辟一个新的内存,来保存这个变量当我们在网页上读取内存较大的文件时(比如视频、图片等),写入写出会极大的占用内存这时候就需要在node.js中提供给我们的流——streamstream可以边读边写,这样就可以更好的不占用太多内存,并且完成所需任务stream分为四种:readable、wr...

踏雪无痕的博客 2万+

NodeJSprocess对象

文章目录1 process简介1.1 进程信息1.2 退出码2 属性2.1 stdout,stdin,stderr2.1.1 stdout2.1.2 stdin2.1.3 stderr2.2 argv,execPath,execArgv2.3 process.env3 方法3.1 process.cwd(),process.chdir()3.2 process.nextTick()3.3 proc...

上善若泪 5340

js实现审批流_Nodejs Stream pipe 的使用与实现原理分析

通过流我们可以将一大块数据拆分为一小部分一点一点的流动起来,而无需一次性全部读入,在 Linux 下我们可以通过 | 符号实现,类似的在 NodejsStream 模块中同样也为我们提供了 pipe() 方法来实现。1. Nodejs Stream pipe 基本示例选择 Koa 来实现这个简单的 Demo,因为之前有人在 “Nodejs技术栈” 交流群问过一个问题,怎么在 Koa 中返回一...

weixin_34365489的博客 1205

Node.js中的pipe方法与背压处理全面讲解:示例代码与分析

背压问题是指当可读流的读取速度超过可写流的写入速度时,数据会在内存中积压,可能导致内存泄漏或程序崩溃。Node.js的pipe方法内部已经实现了一套背压处理机制,但在某些情况下,我们仍然需要手动干预来解决背压问题。

1214

NodeJS stream入门

本文简介 点赞 + 关注 + 收藏 = 学会了 Stream 是一个概念,翻译成中文就是 “流” 的意思。它并非 NodeJS 独有。 本文就用 NodeJS 举例说明 StreamStream 简介 在传输大文件、视频、音频时,通常是分段传输的,可以把这个概念粗略的理解StreamStream 的中文意思是 “流” ,我在网上找了个图很好的讲明这个东西。 传多少过来就接多少,而这个传输过程我们使用 NodeJS 时是不需要关心的,因为 NodeJS 提供了对应的方法来处理。 在

weixin_39415598的博客 425

NodeJS Stream入门

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情 本文简介 点赞 + 关注 + 收藏 = 学会了 Stream 是一个概念,翻译成中文就是 “流” 的意思。它并非 NodeJS 独有。 本文就用 NodeJS 举例说明 StreamStream 简介 在传输大文件、视频、音频时,通常是分段传输的,可以把这个概念粗略的理解成 Stre...

weixin_39415598的博客 153

探索NodeJS中的Stream:数据流动的艺术

探索NodeJS中的Stream:数据流动的艺术 在编程的广阔天地里,Stream(流)无疑是一个令人着迷的概念。今天,我们将一起揭开NodeJSStream的神秘面纱,探索它如何优雅地处理大量数据,以及为何这一特性使之成为现代开发不可或缺的一部分。 一、项目简介 本项目深入浅出地讲解了NodeJS中的Stream概念,适合所有想要理解这一复杂但强大的特性的开发者。通过一系列精心设计的例子,作者...

gitblog_00682的博客 490

理解node中的stream的背压机制

今天大家聊一聊node中的stream的背压机制。 为什么要有流 在编写服务时,经常会需要涉及到文件或者数据压缩的问题。 使用合适的压缩算法能够有效减少请求文件的大小,从而减少网络中的数据传输量,提升响应速度。 假设我们采用最普通的方式处理一个文件的获取,压缩,发送这个过程,就会是如下所示的图形表示: 我们看到整个执行流程是串行的,所有耗时都会累加,导致整个过程耗时很长。 流的出现就是为了解决这个串行处理的问题。 如下图所示,我们将整个文件分成一个个小块,利用生产者消费者模式,上一个阶段的操作有一小部

黄腾霄的博客 496

深入理解nodejs Stream模块

为什么应该使用流 你可能看过这样的代码。 var http = require('http'); var fs = require('fs') var server = http.createServer(function (req, res) { fs.readFile(__dirname + '/data.txt', function (err, dat res.e

u012229321的博客 536

nodejs 解析http_如何在NodeJS中大规模解析PDF:做什么不做什么

nodejs 解析httpby Tom 由汤姆 如何在NodeJS中大规模解析PDF:做什么不做什么 (How to parse PDFs at scale in NodeJS: what to do and what not to do) Take a step into program architecture, and learn how to make a practical sol...

cumian8165的博客 1572

nodejs中流(stream)的理解

nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encoding: 'utf8'}); fs.writeFileSync('/path/to/dest', source); 这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件...

120

StreamBuffer

StreamNodeJS(也可以说是后端)中的一个必不可少的概念。 让我们操作大文件或者大传输流的时候,可以分批处理,而不用一次性把内容读取到缓冲区才开始处理。WhatStream在一个应用程序中,流是一组有序的、有起点终点的字节数据的传输手段。Buffer用于创建一个专门存放二进制数据的缓存区1.1 StreamStream 有四种流类型,且所有的 Stream 对象都是 EventEmit

KevinChen 7120

一些关于GulpNodeJS Stream理解

近期学习GulpBrowserify,按照网上的教程可以实现两者的整合,但是总存在各种疑惑,例如,两者为什么可以整合、为什么需要一些另外的模块的辅助才能整合、以及对于NodeJSStream API本身的疑惑。只有弄清楚其中的原理,才能自己灵活地运用Gulp来整合一些有用的工具,也能享受Stream API的灵活性。 内容: Stream API 简介 Gulp如何使用Stream ...

weixin_34112208的博客 167

深入理解 Node.js Stream:高效处理大文件数据流

Stream(流) 是 Node.js 提供的高效数据处理机制,它可以在不占用大量内存的情况下,以分块(chunk)的方式流式处理数据,适用于大文件处理、实时数据传输、日志处理等场景。 本篇文章将从 基础概念 到 实战案例,深入讲解 Node.js Stream 流式处理 的原理及应用,帮助你提升 I/O 操作的效率。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1476

前端基础知识NodeJS系列 - 06( Node 中的 Stream理解?应用场景?)

摘要: 流(Stream)是Node.js中处理数据传输的核心机制,通过分块读取/写入数据优化内存使用。它分为四类:可读流(如文件读取)、可写流(如文件写入)、双工流(双向通信,如WebSocket)转换流(如Babel转码)。典型应用包括HTTP文件传输(source.pipe(res))、文件拷贝(通过管道连接读写流)及打包工具(如Gulp)的底层操作。流的管道(pipe机制实现了高效IO处理,避免一次性加载大文件,提升性能。

m0_67078501的博客 505
上一篇: 理解AES加密解密的使用方法
下一篇: tyk评价
Vieri_32
博客等级 码龄11年 11粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值