Я пытаюсь заставить nodejs взаимодействовать с adventure, старой текстовой игрой. Идея состоит в том, чтобы открыть приключение как дочерний процесс, а затем запустить игру, записав в его stdin
и поместив прослушиватель событий в stdout
.
Когда игра запускается, она печатает инициал:
Добро пожаловать в приключение!! Хотите инструкции?
Итак, чтобы проиллюстрировать мою проблему, у меня есть экземпляр nodejs+express с:
var childProcess = require('child_process');
var spawn = childProcess.spawn;
var child = spawn('adventure');
console.log("spawned: " + child.pid);
child.stdout.on('data', function(data) {
console.log("Child data: " + data);
});
child.on('error', function () {
console.log("Failed to start child.");
});
child.on('close', function (code) {
console.log('Child process exited with code ' + code);
});
child.stdout.on('end', function () {
console.log('Finished collecting data chunks.');
});
Но когда я запускаю сервер, текст из игры не доходит до прослушивателя событий:
spawned: 24250
Это все, что я получаю. Даже слушатель child.stdout.on
никогда не вызывается. Почему не подхватывается эта начальная строка из игры?
Если я добавлю следующую строку к приведенному выше блоку javascript, то сразу появится вывод программы. Итак, adventure
запускается, и теперь я могу заставить его активировать прослушиватель событий child.stdout.on
... но это также завершает дочерний процесс, что противоречит цели чтения и записи в него.
...
child.stdout.on('end', function () {
console.log('Finished collecting data chunks.');
});
child.stdin.end();
Теперь вывод:
spawned: 28778
Child data:
Welcome to Adventure!! Would you like instructions?
user closed input stream, quitting...
Finished collecting data chunks.
Child process exited with code 0
Я уверен, что это тривиальная оплошность с моей стороны, но я ценю любую помощь в этом.