【问题标题】:Node.js transform stream - Find the source name in _transform functionNode.js 转换流 - 在 _transform 函数中查找源名称
【发布时间】:2015-04-17 03:41:37
【问题描述】:

我已经在 Windows 7 上安装了 node.js,并且我正在使用转换流的基本示例来解压缩目录中的日志文件并使用 _transform 函数异步读取日志文件。

这个过程很快,但是现在我有一个问题:

我需要将源文件名映射到过滤后的行。我尝试将文件名附加到 on.readable 事件中的过滤行,但它不正确,因为数据从多个文件异步输出,因此将所有内容映射到单个文件名。我尝试了一些类似下面的代码,但这会引发错误,说创建了太多的事件侦听器。

source.pipe(gunzip).pipe(liner).pipe(new Upper(filename).pipe(process.stdout));

【问题讨论】:

  • 更新:我测试了以下管道的单个文件,它工作正常。我尝试在 fs.readdir 的回调函数中使用管道,现在它失败并出现同样的太多事件侦听器错误。如何安全地使用 fs.readdir ?以下流管道适用于单个文件流:sourcefs.pipe(gunzip).pipe(liner).pipe(upper).pipe(outputfs);

标签: javascript node.js


【解决方案1】:

发现解决方案基本上需要为每一行创建单独的管道,即兴代码如下:

    var gunzip = [];
    var source = [];
    var upper = [];
    var outputfile = [];
    var liner = [];
    .
    .
    .
    function file(i) {
        var filename = files[i];
        gunzip[i] = zlib.createGunzip();
        source[i] = fs.createReadStream(__dirname + '/' + filename);
        upper[i] = new Upper();
        liner[i] = new LineSplitter();
        outputfile[i] = fs.createWriteStream(__dirname + '/' + '_' + i + '_outputfile.txt');
        source[i].pipe(gunzip[i]).pipe(liner[i]).pipe(upper[i]).pipe(outputfile[i]);
            }

作为进一步的步骤,希望使用异步模块来并行运行这些管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多