В приложении ExpressJS возможно ли собирать данные, записанные на консоль, в режиме реального времени во время выполнения скрипта? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь получить выходные данные bash-скрипта в приложение ExpressJS, где я могу затем отправить данные клиенту. Я создал скрипт ниже, который имитирует вывод фактического скрипта, который я буду использовать для моего проекта. Я хочу иметь возможность собирать эти данные в том виде, в котором они были записаны в терминал, сохранять их в переменной в моем экспресс-приложении, откуда я затем могу отправлять данные через SSE или через веб-сокет.

n=`expr 10 \* $1`
executionprocessing="processing"
jobdone="done"
sleep 5
echo $executionprocessing
sleep 5
echo $jobdone
echo $n

Что у меня так далеко:

app.post('/compute', function(req, res) {
  shell.exec('sh ./Scripts/mytestscript.sh 10', function(code, stdout, stderr) {
    console.log('code:' + code)
    console.log('stdout:' + stdout)
  })
})

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

EDIT: дочерний процесс - это путь. Вот мое решение для всех, кто имеет эту проблему.

const child = spawn('sh',['mytestscript.sh','10'],{cwd:'./Scripts'})
child.stdout.on('data', (data) => {
  console.log('code:' + data.toString())
});

1 Ответ

0 голосов
/ 07 января 2019

Насколько я могу судить, это не может быть сделано с ShellJS. Однако это должно быть возможно с помощью встроенного в узел дочернего процесса. Вы можете передать sh ./Scripts/mytestscript.sh 10 в spawn , который вернет объект ChildProcess . Одним из свойств этого объекта, stdout, является читаемый поток, который транслирует стандартный вывод вашего скрипта.

Код, вероятно, будет выглядеть примерно так:

const { spawn } = require('child_process');

var child = spawn('sh ./Scripts/mytestscript.sh 10');
child.stdout.on('data', (data) => {
    // do stuff with data chunk that the script sent to stdout
});

Если вы просто хотите отправить данные напрямую в веб-сокет, то также возможно сделать просто child.stdout.pipe(yourWebsocketSteam);.

...