29

エラーの取得に問題があります:

events.js:48
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: write EPIPE
    at errnoException (net.js:670:11)
    at Object.afterWrite [as oncomplete] (net.js:503:19)

出力をヘッドにパイプする場合。それを試す簡単なケースは次のとおりです。

console.log('some string');
... the same for 20 lines

そして、node test.js | headUbuntu 12.04 で約 70% の実行で表示されるように見えるエラーを取得します。どうしたの?

4

3 に答える 3

24

閉じたパイプの場合に正常に終了するようにプログラムを変更するには、次のことを試してください。

process.stdout.on('error', function( err ) {
    if (err.code == "EPIPE") {
        process.exit(0);
    }
});
于 2013-04-08T16:42:26.527 に答える
20

このheadコマンドは、最初の数行のみを読み取ります。コードはすべての出力が読み取られることを想定しており、出力を生成できない場合はエラーをトリガーします。プログラムからの出力を破棄することが合法である場合は、それをプログラムの致命的なエラーとして扱わないでください。プログラムからの出力を破棄することが違法である場合は、 にパイプしないでくださいhead

現在、競合状態にあります。headプログラムが出力の書き込みを完了する前に入力の無視を開始すると、プログラムは例外を受け取ります。プログラムheadが入力の無視を開始する前に出力の書き込みを終了した場合、すべて問題ありません。

ばかげた一時的な修正として:node test.js | tee /dev/null | head
これで、teeすべてのプログラムの出力が取得されます。

于 2012-09-08T10:21:12.653 に答える