nodejs-stream

本文深入探讨了Node.js中Stream模块的四种类型:Readable、Writable、Duplex和Transform,讲解了它们的工作原理、使用场景及事件处理。同时,介绍了流的流动模式、状态管理以及在文件读写、压缩解压等场景的应用。

stream模块初解,流的类型,流的历史

const stream = require('stream');

stream 流 是一种在nodejs中处理‘流式数据’的抽象接口

Node.js,Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。

可读流Readable的使用,可写流Writable的使用

Readable:两种模式,三种状态

两种模式:流动中(flowing)或已暂停(paused),可读流一档处于二者其一

  • 在 flowing 模式中,数据自动地从底层的系统被读取,并通过 EventEmiter 接口的事件尽可能快地被提供给应用程序。
  • 在 paused 模式中,必须显式调用 stream.read() 方法来从流中读取数据片段。

三种状态:在任意时刻,任一可读流会处于以下三种状态之一:

  • readable.readableFlowing = null    // 没有提供消费流数据的机制,不会产生数据
  • readable.readableFlowing = false   // 暂时停止事件流动,但数据依旧产生
  • readable.readableFlowing = true    // 事件流动,产生数据

事件:close、data、end、error、readable

Writable

事件:close、drain、finish、error、pipe、unpipe

Duplex的使用,Transform的使用

Duplex:同时实现了 Readable 和 Writable 接口的流

Transform:变换流,是一种 Duplex 流

stream的流的使用技巧,管道,链的使用,流的优化

管道流:.pipe()

 

fs中的流使用:大多用在管道流的使用上:.pipe().pipe()...

// import { read } from 'fs';

var cl = function(data){
    console.log(data);
}
var clstr = function(data){
    console.log(data.toString());
}

/** Stream 流的四种类型:
 * Readable : 可读
 * Writeable : 可写
 * Duplex : 可读可写
 * Transform : 操作被写入数据,然后读出结果
 */
/** Stream 对象事件
 * data : 当有数据可读时触发。
 * end : 没有更多的数据可读时触发
 * error : 在接收和写入过程中发生错误时触发
 * finish : 所有数据已被写入到底层系统时触发
 */

var fs = require('fs');
var stream = require('stream');
var data = '';

/** 创建测试文件 */
var fcreateFile = function(){
    fs.writeFile('./theTest.txt','this is a test data of strem', function(err){
        if(err){
            throw err;
        }
        cl('创建成功');
    })
}
// fcreateFile();


/** 创建可读文件流 */
var freadStream = function(){
    // 创建可读流
    var readerStream = fs.createReadStream('theTest.txt');
    // cl(readerStream);   // 一个ReadStream格式的对象

    // 设置编码utf8
    readerStream.setEncoding('UTF8');

    // 处理流事件---->data, end, and error
    readerStream.on('data', function(chunk){
        data += chunk;

        cl('监听事件---->data');
        cl(data);       // 'this is a test data of strem' 文件内容
    })

    readerStream.on('end', function(){
        cl('监听事件---->end');
        cl(data);       // 'this is a test data of strem' 文件内容
    })

    readerStream.on('error', function(err){
        console.error('ERROR!!!')
        cl(err.stack);
    })
}
// freadStream();


/** 写入文件流 */
var fwriteStream = function(){
    var data = 'the test of write Stream\n';
    // 创建可写流
    // var writeStream = fs.createWriteStream('output.txt');   // 覆盖式写入
    var writeStream = fs.createWriteStream('output.txt', {'flags' : 'a'});  // 追加式写入

    // 写入数据并指定编码格式
    writeStream.write(data, 'UTF8');
    // writeStream.write(data, {'flags' : 'a'}, 'UTF8');    ERROR function!!!!

    // 标记文件末尾
    writeStream.end();

    // 处理流事件---->data, end, and error
    writeStream.on('finish', function(){
        cl('写入完成');
    });

    writeStream.on('error', function(err){
        cl('ERROR');
        cl(err.stack);
    });
}
// fwriteStream();

/** 管道流
 * 用于从一个流中获取数据并将数据传递到另外一个流中
 */
var fpipeStream = function(){
    // 可读文件流
    var readerStream = fs.createReadStream('pipe_read.txt');

    // 追加写入方式文件流
    var writeStream = fs.createWriteStream('pipe_write.txt',{'flags' : 'a'});

    //管道读写操作
    readerStream.pipe(writeStream);

    cl('Over');
}
// fpipeStream();


/** 链式流 */
var fzlib = function(){
    var zlib = require('zlib');
    // 压缩
    exports.a = function(){
        fs.createReadStream('./zlib/input.txt')
            .pipe(zlib.createGzip())
            .pipe(fs.createWriteStream('./zlib/input.txt.gz'));
        
        cl('文件压缩完成');
    }

    // 解压
    exports.b = function(){
        fs.createReadStream('./zlib/input.txt.gz')
            .pipe(zlib.createGunzip())
            .pipe(fs.createWriteStream('./zlib/output.txt'));

        cl('文件解压完成')
    }
}
// fzlib().a();
cl(fzlib);

 

正在解决依赖关系 --> 正在检查事务 ---> 软件包 nodejs.x86_64.2.22.14.0-1nodesource 将被 安装 --> 正在处理依赖关系 glibc >= 2.28,它被软件包 2:nodejs-22.14.0-1nodesource.x86_64 需要 --> 正在处理依赖关系 libm.so.6(GLIBC_2.27)(64bit),它被软件包 2:nodejs-22.14.0-1nodesource.x86_64 需要 --> 正在处理依赖关系 libstdc++.so.6(CXXABI_1.3.9)(64bit),它被软件包 2:nodejs-22.14.0-1nodesource.x86_64 需要 --> 正在处理依赖关系 libstdc++.so.6(GLIBCXX_3.4.20)(64bit),它被软件包 2:nodejs-22.14.0-1nodesource.x86_64 需要 --> 正在处理依赖关系 libstdc++.so.6(GLIBCXX_3.4.21)(64bit),它被软件包 2:nodejs-22.14.0-1nodesource.x86_64 需要 --> 正在处理依赖关系 libc.so.6(GLIBC_2.28)(64bit),它被软件包 2:nodejs-22.14.0-1nodesource.x86_64 需要 --> 处理 nsolid-20.18.2-ns5.7.0.x86_64 与 nodejs 的冲突 --> 解决依赖关系完成 错误:软件包:2:nodejs-22.14.0-1nodesource.x86_64 (nodesource-nodejs) 需要:libstdc++.so.6(GLIBCXX_3.4.21)(64bit) 错误:软件包:2:nodejs-22.14.0-1nodesource.x86_64 (nodesource-nodejs) 需要:glibc >= 2.28 已安装: glibc-2.17-326.el7_9.3.x86_64 (@updates) glibc = 2.17-326.el7_9.3 可用: glibc-2.17-317.el7.i686 (base) glibc = 2.17-317.el7 可用: glibc-2.17-322.el7_9.i686 (updates) glibc = 2.17-322.el7_9 可用: glibc-2.17-323.el7_9.i686 (updates) glibc = 2.17-323.el7_9 可用: glibc-2.17-324.el7_9.i686 (updates) glibc = 2.17-324.el7_9 可用: glibc-2.17-325.el7_9.i686 (updates) glibc = 2.17-325.el7_9 可用: glibc-2.17-326.el7_9.i686 (updates) glibc = 2.17-326.el7_9 错误:软件包:2:nodejs-22.14.0-1nodesource.x86_64 (nodesource-nodejs) 需要:libstdc++.so.6(GLIBCXX_3.4.20)(64bit) 错误:软件包:2:nodejs-22.14.0-1nodesource.x86_64 (nodesource-nodejs) 需要:libc.so.6(GLIBC_2.28)(64bit) 错误:软件包:2:nodejs-22.14.0-1nodesource.x86_64 (nodesource-nodejs) 需要:libstdc++.so.6(CXXABI_1.3.9)(64bit) 错误:软件包:2:nodejs-22.14.0-1nodesource.x86_64 (nodesource-nodejs) 需要:libm.so.6(GLIBC_2.27)(64bit) 错误:nsolid conflicts with 2:nodejs-22.14.0-1nodesource.x86_64 您可以尝试添加 --skip-broken 选项来解决该问题 您可以尝试执行:rpm -Va --nofiles --nodigest 如何解决
03-08
<think>嗯,用户遇到了在安装Node.js时出现的依赖问题。首先,我需要仔细看看错误信息。看起来主要问题集中在glibc和libstdc++的版本上,还有与nsolid的冲突。 用户使用的是CentOS 7或者RHEL 7,因为glibc的版本显示为2.17,而需要的版本是2.28。CentOS 7的默认glibc版本确实是2.17,无法直接升级到2.28,因为这是系统核心组件,升级可能导致系统不稳定。因此,安装需要更高glibc版本的Node.js 22.14.0在这里不可行。 另外,libstdc++相关的错误也指向了依赖版本过低的问题。libstdc++通常由GCC版本决定,CentOS 7默认的GCC版本可能过低,无法提供所需的CXXABI和GLIBCXX符号。用户可能需要升级GCC,但同样,这可能会影响系统其他组件。 还有nsolid的冲突,可能用户之前安装了nsolid,而它和当前要安装的Node.js版本不兼容,可能需要先卸载nsolid。 解决方案方面,首先应该建议用户考虑使用更低版本的Node.js,比如通过NodeSource提供的适用于CentOS 7的版本,如Node.js 16或18,这些可能对glibc的要求较低。或者,使用nvm来管理Node.js版本,这样可以在用户目录下安装,避免系统依赖问题。 另外,如果用户必须使用Node.js 22,可能需要考虑升级操作系统到CentOS 8或更高版本,或者使用容器技术如Docker,在容器中运行基于较新glibc的环境。 还有,用户提到的错误中建议添加--skip-broken选项,这可能暂时绕过问题,但不推荐,因为可能导致安装不完整或运行时问题。而rpm -Va是验证所有包,可能帮助检查损坏,但未必能解决当前依赖问题。 总结,用户的主要问题在于系统环境过旧,无法满足Node.js新版本的依赖。应该建议调整Node.js版本或升级系统环境。同时处理nsolid的冲突问题可能需要先卸载冲突的软件包。</think>这个依赖关系错误显示您正在CentOS/RHEL 7系统上尝试安装Node.js 22.14.0时遇到了核心库版本不兼容的问题。以下是分步解决方案: $$ \text{核心问题} = \begin{cases} \text{glibc版本过低(需要≥2.28,当前2.17)} \\ \text{libstdc++符号缺失(需要CXXABI_1.3.9等)} \\ \text{nsolid软件包冲突} \end{cases} $$ **解决方案选择:** 1. **推荐方案:使用兼容的Node.js版本** ```bash # 先卸载冲突包(如果已安装) sudo yum remove nsolid # 安装Node.js 16.x(CentOS 7官方支持的最新LTS版本) curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - sudo yum install nodejs ``` $$ \text{优势} = \begin{cases} \text{无需升级系统组件} \\ \text{保持系统稳定性} \\ \text{仍支持到2024-04-30} \end{cases} $$ 2. **替代方案:使用nvm安装(用户级安装)** ```bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 18 # 选择兼容版本 ``` 3. **高级方案:升级系统环境(需谨慎)** ```bash # 临时方案:升级libstdc++ sudo yum install devtoolset-10 scl enable devtoolset-10 bash # 长期方案:升级到CentOS Stream 8/9 sudo dnf --releasever=8 upgrade ``` **错误原因分析表:** | 依赖项 | 当前版本 | 要求版本 | 影响等级 | |--------|----------|----------|----------| | glibc | 2.17 | ≥2.28 | ⚠️ 关键 | | libstdc++.so.6 | 3.4.19 | 需要3.4.20/21 | ⚠️ 高 | | CXXABI | 1.3.7 | 需要1.3.9 | ⚠️ 高 | | GLIBC_2.28 | 缺失 | 需要 | ⚠️ 关键 | **建议操作流程:** 1. 备份系统(重要!) 2. 执行`yum provides '*/libstdc++.so.6'`查看现有库版本 3. 根据业务需求选择解决方案: - 开发环境 ➔ 使用nvm - 生产环境 ➔ 使用Node.js 16.x - 长期维护 ➔ 升级操作系统 注:强制升级glibc可能导致系统崩溃,官方文档明确指出`glibc`是核心系统组件,不支持直接升级。建议通过Docker容器运行新版本Node.js: ```bash sudo yum install docker sudo systemctl start docker docker run -it node:18-alpine ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值