在管道流节点js中添加

时间:2019-03-05 16:33:19

标签: javascript node.js stream pipe

我目前正在nodeJS中构建调度应用程序。

我有一个要动态生成的时间表模板。我知道这对于流来说是可能的,更具体地说是对管道,尽管我无法让它在流的中间注入代码。

我尝试过的事情:

var through2 = require( "through2" );
input.pipe(through2(function (chunk, encoding, done){
            var transformChunk = chunk.toString()
            console.log(transformChunk);

            if (transformChunk.includes("\\newDay{}{}")){
                transformChunk += "newDay{12}{12}";
                this.push(transformChunk);
            }



            done();
        }))

这根本不会改变任何东西。

我还尝试制作自己的自定义转换类

const { Transform } = require('stream');

        class injectText extends Transform {

            constructor(string){
                super();
                this.replaceString = string;
            }

            _transform(chunk, encoding, callback) {
                // var transformChunk = chunk.toString().replace("newDay{}{}", this.replaceString);
                var transformChunk = chunk.toString()
                if (transformChunk.includes("newDay{}{}")){

                    transformChunk += "newDay{12}{12}";

                }

                this.push(transformChunk)
                console.log(transformChunk);
                callback();
            }

        };

        var changedStream = new injectText('newDay{11}{11}');

但这只会增加更多的麻烦。

字符串替换仅适用于一行。
我的问题是我需要用多行新行替换该行。

1 个答案:

答案 0 :(得分:0)

是否可以为此使用异步生成器(async *function)和异步迭代器(for await)?大概是这样的:

async *inputGenerator() {
    for await (const chunk of input) {
        var transformedChunk = chunk.toString();
        if (transformedChunk.includes("\\newDay{}{}")){
            transformedChunk += "newDay{12}{12}";
        }
        yield transformedChunk;
     }
}

// do something with the transformed input
for await (const chunk of inputGenerator()) {
    .....
}

异步迭代器在ES2018 / Node 10上可用