web-dev-qa-db-ja.com

エラー:ノードの出力を「|ヘッド」にパイピングするときにEPIPEを書き込みます

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

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 | headエラーを取得するには、Ubuntu 12.04で約70%実行すると表示されるようです。どうしたの?

22
Fluffy

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

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

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

18
David Schwartz

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

process.stdout.on('error', function( err ) {
    if (err.code == "EPIPE") {
        process.exit(0);
    }
});
19
Jim