MST

星途 面试题库

面试题:Node.js中Duplex流与Transform流的区别

在Node.js开发中,阐述Duplex流与Transform流在数据处理和应用场景上有哪些明显的区别,并举例说明各自适用的场景。
33.0万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

Duplex流与Transform流区别

  1. 数据处理
    • Duplex流:Duplex流是可读可写流,可读和可写操作相互独立。它允许数据在两个方向上流动,但是读写操作之间没有内在的数据转换逻辑关联。例如,一个网络套接字(net.Socket)就是一种Duplex流,它可以接收来自网络的数据(可读),也可以向网络发送数据(可写),读写操作不相互依赖。
    • Transform流:Transform流也是可读可写流,但它在数据从可读端流向可写端的过程中会对数据进行转换。它的核心特点是输入数据经过一定的逻辑处理后再输出。比如zlib.createGzip()创建的流,它会将输入的数据进行压缩后输出,实现了数据的转换。
  2. 应用场景
    • Duplex流
      • 网络通信:在客户端 - 服务器模型中,客户端与服务器之间的网络连接(如net.Socket)。客户端可以向服务器发送请求(可写操作),同时接收服务器的响应(可读操作)。例如,一个简单的TCP客户端程序,向服务器发送一些文本请求,并接收服务器返回的处理结果。
const net = require('net');
const client = new net.Socket();
client.connect(8080, '127.0.0.1', () => {
    client.write('Hello, server!');
});
client.on('data', (data) => {
    console.log('Received from server:', data.toString());
});
client.on('close', () => {
    console.log('Connection closed');
});
  - **文件操作(双向)**:如果需要在读取文件的同时写入另一个文件,且写入内容不需要基于读取内容转换。比如将一个文件的内容直接复制到另一个文件,同时可以向源文件追加一些日志信息(不基于文件原内容转换)。
- **Transform流**:
  - **数据格式转换**:将JSON格式的数据转换为CSV格式。比如在处理一些数据报表需求时,从数据库获取的是JSON格式数据,而需要输出为CSV格式供用户下载。
const { Transform } = require('stream');
const jsonToCsv = new Transform({
    transform(chunk, encoding, callback) {
        const json = JSON.parse(chunk.toString());
        const csvLine = Object.values(json).join(',') + '\n';
        this.push(csvLine);
        callback();
    }
});
// 假设 sourceStream 是一个可读流,包含JSON数据
sourceStream.pipe(jsonToCsv).pipe(process.stdout);
  - **数据加密/解密**:在数据传输过程中,对数据进行加密或解密操作。例如使用`crypto.createCipheriv()`和`crypto.createDecipheriv()`创建的流分别用于加密和解密数据。当数据从可读端进入加密流后,经过加密转换,从可写端输出加密后的数据。