Подтвердить что ты не робот

Ошибка: напишите EPIPE, когда трубопровод node выводится на "| head"

У меня возникают проблемы с получением ошибки:

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, чтобы получить ошибку, которая, кажется, появляется примерно в 70% на Ubuntu 12.04. В чем проблема?

4b9b3361

Ответ 1

Команда head только считывает первые несколько строк. Ваш код ожидает, что весь его вывод будет считан и будет вызывать ошибку, если он не может произвести вывод. Если законно удалять выходные данные из вашей программы, не рассматривайте его как фатальную ошибку в программе. Если это не легально, чтобы выбросить выход из вашей программы, не подключайте его к head.

В настоящее время у вас есть состояние гонки. Если head начинает игнорировать ввод до того, как программа завершит запись своего вывода, программа получит исключение. Если программа завершит запись своего вывода до того, как head начнет игнорировать его вход, все будет в порядке.

Как глупое временное исправление: node test.js | tee /dev/null | head
Теперь tee будет принимать все выходные данные программы.

Ответ 2

Чтобы изменить программу для успешного завершения в случае закрытого канала, попробуйте:

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