Узел дочерний процесс, не получающий вывод из CLI - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь запустить базовую команду cmd с дочерним процессом, я тестирую некоторые cli с помощью nodejs и не могу понять, почему я не получаю никакого вывода, вот простой пример:

const spawn = require('child_process').spawn
let child = spawn('cmd.exe',['/K'])
child.stdout.setEncoding('utf8');
child.stdout.on('data', (data) => {
    console.log(data.toString())
});

child.stdin.write('heroku login\n');

Вывод должен быть:

heroku: 

Enter your login credentials

Email :

что мне не хватает? Thx

Обновление:

Я играю с кодом и могу получить то, что хочу:

const spawn = require('child_process').spawn
let child = spawn('heroku',['login' ,'-i']);

child.stderr.on('data', function(data) {        
    child.stdin.write('email@hotmail.com');
});

После того, как stderr.on сработалМне нужно ввести адрес электронной почты, но после того, как я позвоню child.stdin.write('email@hotmail.com');, я получаю сообщение об ошибке:

'sh' is not recognized as an internal or external command,
operable program or batch file.

Может кто-нибудь сообщить мне, что может быть причиной этой ошибки?

1 Ответ

0 голосов
/ 20 октября 2019

Я не смог найти ничего, что могло бы решить эту проблему, но, проведя онлайн-исследование, я обнаружил, что node-pty (https://github.com/microsoft/node-pty), который выполняет эту работу, для Windows вам нужно установить дополнительные приложения, но он работает с большинством CLI, которые япротестировано, вот простой пример:

var os = require('os');
var pty = require('node-pty');

var shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';
var ptyProcess = pty.spawn(shell, ['heroku login -i'], {
    name: 'heroku',
    cwd: process.env.HOME,
    env: process.env
});
ptyProcess.write('my@email.com\r');
ptyProcess.write('password\r');
ptyProcess.on('data', function(data) {
    ptyProcess.write('\n');
    process.stdout.write(data);
});

, а вот еще один:

var os = require('os');
var pty = require('node-pty');

var shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';
var ptyProcess = pty.spawn(shell, ['vue create app'], {
    name: 'vue',
    cwd: process.env.HOME,
    env: process.env
});
ptyProcess.write('keydown');
ptyProcess.on('data', function(data) {
    process.stdout.write(data.toString().trim());
});
...