【问题标题】:Piping to same Writable stream twice via different Readable stream通过不同的可读流两次管道到相同的可写流
【发布时间】:2018-03-12 06:56:52
【问题描述】:

我正在尝试将一个字符串和一个可读流(可读流指向一个文件,该文件可能包含多个块中的数据,即文件可能很大)连接到一个可写流中,以便可写流最终可以写入目的地。

我正在加密文件的字符串和内容,然后对它们应用 zlib 压缩,最后我想将它们通过管道传输到可写流。

为此,我可以:

a) 将文件内容转换为字符串,然后连接两个字符串,然后加密、压缩,最后通过管道将其传输到可写流中。但这是不可能的,因为文件可能很大,因此我无法将其内容转换为字符串。

为此,我写了这个:

var crypto = require('crypto'),
    algorithm = 'aes-256-ctr',
    password = 'd6FAjkdlfAjk';

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

// input file
var r = fs.createReadStream('file.txt');
// zip content
var zip = zlib.createGzip();
// encrypt content
var encrypt = crypto.createCipheriv(algorithm, password, iv);

var w = fs.createWriteStream('file.out');

// the string contents are being converted into a stream so that they can be piped
var Readable = stream.Readable;
var s = new Readable();
s._read = function noop() {};
s.push(hexiv+':');
s.push(null);
s.pipe(zlib.createGzip()).pipe(w);

// start pipe when 'end' event is encountered
s.on('end', function(){
    r.pipe(zip).pipe(encrypt).pipe(w);
});

我观察到的是:

只有第一个管道成功完成,即字符串写入file.out。第二个管道对输出目标没有任何影响。起初,我认为原因可能是由于管道的异步行为。因此,出于这个原因,我在第一个管道关闭后对文件内容进行管道传输。但是,我仍然没有得到想要的输出。

我想知道为什么会发生这种情况。

【问题讨论】:

  • 您指的是哪个.pipe() 电话?在end 事件中?
  • zip 已定义的情况下调用 s.pipe(zlib.createGzip()).pipe(w); 的目的是什么?
  • @guest271314 在end 事件中,r 是指向我要读取的文件的可读流。而w 是指向目标文件的可写流。
  • @guest271314 ,是的,我应该使用zip 而不是zlib.createGzip(),但这不会对流的管道产生任何影响。
  • 没试过node.js流实现。是否使用本机 ReadableStreamWritableStream 选项? encrypt 是什么?您是否尝试将错误事件处理程序附加到过程?仍然不确定为什么 .createGzip() 被调用两次? hexiv 定义在哪里?

标签: javascript node.js string stream pipe


【解决方案1】:

找到通往可写流w 的第二个管道不起作用的原因。

当第一个 .pipe(w) 结束时,w 处的可写也自动关闭。

所以我不应该使用s.pipe(zlib.createGzip()).pipe(w);,而是应该使用:

s.pipe(zlib.createGzip()).pipe(w, {end: false});

其中 {end: false} 作为第二个参数传递给 pipe(),表示管道完成后不应该关闭可写对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 2016-02-17
    • 2021-03-03
    • 2014-03-13
    • 2017-08-25
    • 2021-06-04
    • 2021-01-30
    • 2023-03-24
    相关资源
    最近更新 更多