Напишите на порожденный процесс stdin nodejs? - программирование
Подтвердить что ты не робот

Напишите на порожденный процесс stdin nodejs?

У меня есть script, который я хочу запустить из другого. Проблема заключается в том, что дочерний элемент script (process) требует ввода пользователя до его продолжения.

var child = spawn('script');
child.stdin.setEncoding('utf8');
child.stdout.on('data', function (data) {
    console.log(data.toString().trim()); // tells me to input my data
    child.stdin.write('my data\n');
});

После ввода моих данных дочерний элемент script должен продолжаться, но вместо этого он находится там.

Решение

На самом деле приведенный выше код работает для меня. Я использую commander.js в дочернем script, чтобы пригласить пользователя к действию. Вот как я отвечаю на приглашение script для ребенка:

child.stdout.on('data', function (data) {
    switch (data.toString().trim()) {
        case 'Username:':
            child.stdin.write('user');
            break;
        case 'Password:':
            child.stdin.write('pass');
            break;
    }
});

То же самое работает с suppose:

var suppose = require('suppose');

suppose('script')
    .on('Username: ').respond('user')
    .on('Password: ').respond('pass')
.error(function (err) {
    console.log(err.message);
})
.end(function (code) {
    console.log(code);
    done();
});
4b9b3361

Ответ 1

Вы можете использовать пакет suppose. Это как Unix Expect. Полное раскрытие, я автор.

В примере на странице Github вы можете увидеть пример его сценария NPM: https://github.com/jprichardson/node-suppose

Пример:

var suppose = require('suppose')
suppose('script')
.on(/\w*/).respond('my data\n')
.end(function(code){
  console.log('Done: ' + code); 
})