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

Как сжимать скрипты Node.js вместе с помощью Unix | pipe (в командной строке)?

Я вижу, как скомпилировать материал, используя потоки Node.js, но как вы соединяете несколько сценариев вместе с помощью Unix |, учитывая, что некоторые из этих скриптов могут быть асинхронными?

$ ./a.js | ./b.js

Пример:

a.js (chmod 0755)

#!/usr/bin/env node

setTimeout(function(){
  console.log(JSON.stringify({ foo: 'bar' }));
}, 10);

b.js (chmod 0755)

#!/usr/bin/env node

console.log(process.argv);

Это вывод:

$ ./a.js | ./b.js
[ 'node', '/Users/viatropos/tests/b.js' ]

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:883:11)
    at Object.afterWrite (net.js:700:19)

На первый взгляд кажется, что там много чего не так, поэтому не совсем уверен, с чего начать. Есть ли способ заставить это работать? Конечная цель состоит в том, чтобы иметь возможность выводить console.log вывод из ./a.js и использовать его в ./b.js. Причина в том, что в большинстве случаев эти скрипты будут запускаться по одному, но иногда было бы неплохо иметь возможность связывать их вместе, поэтому в идеале система должна иметь возможность обрабатывать оба случая.

4b9b3361

Ответ 1

Проблема заключается в том, что вы b.js сразу заканчиваете и закрываете свой стандарт, что вызывает ошибку в a.js, потому что его стандартный выход отключился, и вы не справились с этой возможностью. У вас есть два варианта: дескриптор stdout закрывается в a.js или принимает ввод в b.js.

Фиксация a.js:

process.on("SIGPIPE", process.exit);

Если вы добавите эту строку, она просто сдастся, когда никто больше не будет читать свой вывод. В SIGPIPE, вероятно, есть что-то лучше, в зависимости от того, что делает ваша программа, но ключ состоит в том, чтобы остановить console.log ing.

Фиксация b.js:

#!/usr/bin/env node

var stdin = process.openStdin();

var data = "";

stdin.on('data', function(chunk) {
  data += chunk;
});

stdin.on('end', function() {
  console.log("DATA:\n" + data + "\nEND DATA");
});

Конечно, вам не нужно ничего делать с этими данными. Ключ должен иметь что-то, что поддерживает процесс; если вы подходите к нему, stdin.on('data', fx) кажется полезной.

Помните, что один из этих параметров предотвратит эту ошибку. Я ожидаю, что второй будет наиболее полезен, если вы планируете переключение между программами.