2016-07-28 17 views
1

私は電子アプリを書いています。電子内でprocess.stdout.on( 'data'、...)とprocess.stderr.on( 'data'、...)の順

npm lsコマンドの実行に問題があります。依存関係のツリーがcliから実行されると、依存関係のツリーがstdoutに出力され、最後にstderrから警告が表示されることがあります。

下記のスクリーンショットを参照してください。

correct output

Iはnpmソースコードビットを掘っ、それが最初の結果を記録し、その後、それがエラーを印刷します。だから私の端末で見るのとまったく同じです。

しかし、私がchild_processspawn(またはexecでも問題ありません)と同じことをすると、順序が異なります。

puzzled output

それは理由stderrは、右のすべてのstdoutの中央に印刷されstdoutデータの大きな塊のように見えます。

私は以下の書いたコード:

// this is mapped to require('child_process').spawn 
this.$set('process', this.spawn(
    'npm', 
    [ 'ls' ], 
    { 
    cwd : options.cwd, 

    // following are only my tryouts - nothing helped :(

    // some npm ls command destroy kill the scripts 
    // with too big buffers in stdout 
    // maxBuffer : 1024 * 5000 
    // shell : true 
    } 
)); 

// this.handleData is only printing out for nwo 
this.process.stdout.on('data', this.handleData); 
this.process.stderr.on('data', this.handleData); 

大きなデータがstdoutから来て、小さなデータがstderrは何とか途中で呼び出されることをstderrから来るとき、それは縫い目。

これが期待どおりの動作ですか?私はこれを何とかして、私の端末と同じ振る舞いを取得するために回避することができますか?

ありがとうございました。 :)

答えて

0

process.stdoutprocess.stderrは、お互いに特定の順序でデータを送信することは保証されていません。あなたが気づいたように、いずれかのパイプにデータ量があるときはいつでもコールバックが呼び出されます。あなたはstderrは一度だけstdoutのすべてが終了した処理されることを確認するには

は、あなたがstdout.on('end', cb)に耳を傾け、それだけでコールバックcbstderr.on('data', this.handleData)を呼び出すこともできます。


言ったあなただけのnpm lsの結果をしたい場合は、おそらくあなたはuse the npm module programmaticallyにしようと考えるかもしれませんか?ドキュメントは素晴らしいものではありませんが、より高度なAPIです。

+1

私もそれについて考えました。ユースケースは、 'stdout'または' stderr'で更新することです。すべての 'stdout'が' stderr'をキャッチするまで待つと、これは他のコマンドとは異なる問題につながるかもしれません。中央に 'stderr'が必要です。 :( npmコマンドは、私がそれを発見した場合にのみ当てはまります。全く異なるコマンドが存在する可能性があります。 –

関連する問題