Дочерний процесс Nodejs не возвращает данные из скрипта Python в стандартный вывод - PullRequest
0 голосов
/ 10 ноября 2019

Я пишу простое веб-приложение, чтобы понять, как работают дочерние процессы узла. По сути, вы вводите свое имя в угловой интерфейс, который передает имя экспресс-серверу в объекте javascript. Бэкэнд передает имя в качестве аргумента простому скрипту Python в качестве аргумента командной строки с использованием модуля child_process. Нет ничего плохого во внешнем интерфейсе, и имя успешно передается бэкэнду, но когда я вызываю stdout в процессе python, оно не работает. Там нет никаких сообщений об ошибках.

Вот экспресс-код:

app.post('/api', (req, res, next) => {
  console.log(req.body.name);

  const spawn = require('child_process').spawn;

  const process = spawn('python3', ['./hello.py', req.body.name]);

  process.stdout.on('data', (data) => {
    console.log(data);
    res.status(200).json({greeting: data});
  });
});

Я поместил два оператора console.log в код для его отладки. Первый выводит данные, но второй внутри функции stdout не вызывается вообще. Сценарий python находится в той же папке, что и экспресс-файл app.js, поэтому я почти уверен, что в пути к файлу нет ничего плохого.

Вот сценарий python:

import sys

print('hello' + sys.argv[1])
sys.stdout.flush()

КогдаЯ запускаю его в командной строке, он работает точно так, как ожидалось, но я все равно включил его на всякий случай.

1 Ответ

0 голосов
/ 10 ноября 2019

Process.stdout.on будет продолжать потоковую передачу до конечного события. Код неверен, потому что вы на самом деле отправляете ответ каждый раз, когда в stdout есть какое-то значение. И вы не можете установить заголовок ответа более одного раза. Попробуйте написать код ниже. Спасибо

 let output;
Process.stdout.on("data", (data) => {
      output += data;
});

Process.on("end", () => {
     // send response here
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...