2017-02-09 8 views
0

Когда Введите незавершенную команду в Монго оболочке, он будет возвращать три точки, указывающей нужно больше, входа для завершения этой команды, как показано ниже:Как получить выход Монго оболочки (три точки) для несогласованной команды

> db.test.find(
... { 
... 

I я использую nodejs child_process.spawn для создания процесса оболочки mongo и прослушивания его вывода. Я могу получить стандартный и вывод ошибок из оболочки mongo, но я не могу получить вывод .... Ниже мой nodejs код:

const shell = spawn('mongo', params); 
     shell 
     .stdout 
     .on('data', (data) => { 
      winston.debug('get output ' + data); 

     }); 

     shell 
     .stderr 
     .on('data', (data) => { 
      const output = data + ''; 
      winston.error('get error output ', data); 

     }); 

я запускаю ниже код, чтобы отправить команду на раковине:

shell.stdin.write('db.test.find('); 

Я брожу, почему я не могу получить ... выход на вышеуказанным способом. Это специальный выход?

EDIT1

Я пытался использовать node-pty и pty.js. Они могут получить выход ..., но они смешивают входные и выходные данные вместе. Их невозможно отделить. Я также пытался использовать stdbuf и unbuffer, чтобы отключить буфер, но он все еще не работает. Кажется, что nodejs child_process не работает с интерактивной командой.

+0

Какова ваша цель, поскольку нерестится оболочка 'mongo' от Node.js? Было бы гораздо проще использовать драйвер [MongoDB Node.js] (https://mongodb.github.io/node-mongodb-native/). – Stennie

ответ

0

Ваш код не содержит ничего, что записывает в stdin вашего дочернего процесса, поэтому я был бы удивлен, если вы получили многоточие, указывающее на неполную команду, когда на самом деле вы вообще не отправляете какую-либо команду - неполную или иную ,

Было сказано, что многие утилиты командной строки ведут себя по-разному, когда обнаруживают реальный терминал, подключенный к их stdin/stdout. Например. git log будет отображать результаты, когда вы запускаете его напрямую, но не при отправке результатов другой команде, например git log | cat, так что это может быть и здесь.

Это также может быть связано с буферизацией - если ваш поток буферизирован в строке, то вы не увидите ни одной строки, которая не заканчивается новой линией сразу.

Настоящий вопрос: вы видите сообщение >? Вы отправляете какую-либо команду в оболочку mongo?

Scritping интерактивные инструменты CLI могут быть сложными. Например. видеть то, что я должен был сделать, чтобы проверить очень простую интерактивную программу здесь:

мне пришлось создать два именованных трубы, убедитесь, что STDIN, STDERR и STDOUT не сохраняются в буфере, а затем используйте некоторые другие трюки, чтобы заставить его работать. Это сценарий оболочки, но это просто показать вам пример.

+0

Жаль, что я не поставил исходный код stdin. Когда я отправил 'db.test.find (' на stdin, я не получил никакого вывода ни из stdout, ни из stderr. Я вижу подсказку '>', но на консоли отображается не метод слушателя. –

 Смежные вопросы

  • Нет связанных вопросов^_^