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

Node.js: Как обнаружить пустой поток stdin?

У меня есть node.js script/server, который считывает некоторые данные из stdin при его запуске. Однако иногда нет данных, которые нужно передать. Это неприятно, потому что похоже, что в этом случае не вызывают события data и end. Как я могу определить, когда это происходит в коде node.js?

Я бы не хотел добавлять специальные символы "конец" в конце ввода, чтобы не навредить клиенту. Соответствующий код ниже:

  var newHTML = '';
  var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb');
  process.stdin.on('data', function(chunk){
    gfm.stdin.write(chunk);
  });
  process.stdin.on('end', function(){
    gfm.stdin.end();
  });
  gfm.stdout.on('data', function(data) {
    newHTML += data;
  });
  gfm.on('exit',function(ecode){
    socket.emit('newContent', newHTML);
  });
  process.stdin.resume();
4b9b3361

Ответ 1

Я верю, что может случиться, что вы вообще не даете партию stdin.

Пример Øystein Steimler показывает, как вы кормите /dev/null в своем приложении:

node pipe.js </DEV/нуль

Однако никогда не обращался, когда вы вообще не отправляете stdin в приложение. Просто запустить node pipe.js не будет, потому что он все еще ждет stdin.

Вы можете протестировать это самостоятельно с другими программами unix, например cat

Попробуйте выполнить следующее:

cat < /dev/null

Теперь попробуйте просто запустить:

cat

Он не выходит, потому что он ждет stdin. Вы можете ввести терминал и отправить в программу, нажав enter. Он все равно не будет выходить (и ждать большего ввода), пока не получит EOF, который вы можете сделать с помощью ctrl + d

Ответ 2

Пустой или отсутствующий поток STDIN обнаруживается событием end от process.stdin.

Этот простой script stdin.js демонстрирует, что:

process.stdin.on( 'data', function(data) { console.log( data ) } );
process.stdin.on( 'end', function() { console.log( 'EOF' ) } );

Различные сценарии:

$ echo test | node stdin.js
<Buffer 74 65 73 74 0a>
EOF
$ echo -n | node stdin.js
EOF
$ node stdin.js < /dev/null
EOF
$

Этот script pipe.js демонстрирует, что использование канала для порожденного дочернего процесса очень хорошо работает:

var spawn = require('child_process').spawn;
var cat = spawn( '/bin/cat' );
cat.stdout.on( 'data', function(data) { console.log( data ) } );
cat.stdout.on( 'end', function() { console.log( 'EOF' ) } );

process.stdin.pipe(cat.stdin);

Как и ожидалось:

$ echo test | node pipe.js
<Buffer 74 65 73 74 0a>
EOF
$ echo -n | node pipe.js
EOF
$ node pipe.js < /dev/null
EOF
$

Ответ 3

Что-то, что вы можете сделать, это заставить ваше приложение принять аргумент типа -s, который заставляет его читать из stdin.

Что делает инструмент CLI LiveScript:

-s, --stdin read stdin