2016-11-24 15 views
2

ある時点で、Node.jsの子プロセスに改行文字でデータをチャンクするように伝えることができると思いました。以下のように、子プロセスからのstderrデータ・イベントは、行ではなく文字と単語に対して発火しています。理想的には、一連のデータが準備されているときにのみデータイベントを発生させるようにストリームに指示するフラグを渡すことができます。これを行う方法はありませんか?Node.jsデータストリームの改行でチャンクを取得

私はこれがあります。

const sh = spawn('sh', [ b ], { 
    cwd: cwd, 
}); 

sh.stdout.pipe(fs.createWriteStream('/dev/null')); 

var stderr = ''; 
var line = ''; 

sh.stderr.setEncoding('utf8'); 

sh.stderr.on('data', function (d) { 

    //trying to split by newlines, but this is hairy logic 
    const lines = String(d).split('\n'); 

    line += lines.shift(); 

    if(lines.length > 0){ 

    if (!String(d).match(/npm/ig) && !String(d).match(/npm/ig)) { 
     stderr += d; 
     process.stderr.write.apply(process.stderr, arguments); 
    } 

    } 

}); 

を、データが戻ってこのハンドラで来るが、行全体ではありません

sh.stderr.on('data', function (d) { 
    // d is chunks of data but not whole lines 
}); 

は、焼成前に改行文字を待つために標準エラー出力を指示するが方法ではありません'data'イベント?

答えて

3

これにはTransform streamを使用できます。

実装はそれほど簡単ではないので、split2のようなライブラリを使用することをお勧めします。

const Transform = require('stream').Transform; 
const StringDecoder = require('string_decoder').StringDecoder; 

const decoder = new StringDecoder('utf8'); 

const myTransform = new Transform({ 
    transform(chunk, encoding, cb) { 
     if (this._last === undefined) { this._last = "" } 
     this._last += decoder.write(chunk); 
     var list = this._last.split(/\n/);   
     this._last = list.pop(); 
     for (var i = 0; i < list.length; i++) { 
     this.push(list[i]); 
     } 
     cb(); 
    }, 

    flush(cb) { 
     this._last += decoder.end() 
     if (this._last) { push(this, this._last) } 
     cb() 
    } 
}); 

sh.stderr.pipe(myTransform) 
     .on('data', function (line) { 
       console.log("[" + line + "]"); 
     });  
+0

おかげで、私は署名欄NPMライブラリを見ていた:

は、ここで基本的な考え方です。 iMoこれはコアライブラリ機能でなければなりませんが、idk –

+0

Well:D NodeJSは常にコア機能を中心にモジュールを構築しています。とにかくそれは決定するコアdevsまでです、私は推測します。 – drinchev

+0

これは正しいアイデアですが、すぐに緑色の小切手をお渡しします –

関連する問題