Express GET: запуск Python с Spawn, чтение файла с помощью fs и отправка ответа дают задержанный результат - PullRequest
0 голосов
/ 24 апреля 2020

Я использовал Express с GET для запуска следующей команды

app.get('/get_temp_hum', function(req, res) {
        var process = spawn('python',["ECIES_decotp.py"]);
        process.stdout.on('data', function(data) {
            console.log(data.toString());
        } )
        process.stderr.on('data', function(data) {
            console.log(data.toString());
        } )
        process.stderr.on('exit', function(code) {
            console.log('Exited with code' + code);
        } )
        fs.readFile('c.json', 'utf8', function (err, data) {
                if (err) throw err;
                //console.log(data);
                temp_hum_json = data;
            })
        res.send(temp_hum_json);
});

И я вызываю URL этого GET, чтобы он мог показать значение res.send(temp_hum_json)

Но по какой-то причине, когда я звоню в первый раз, вместо этого отображается пустая страница, и результат будет показан только после того, как я снова вызову результат. То же самое происходит, когда я звоню с Почтальоном. Это происходит каждый раз, когда я загружаю свой сервер. Это проблематично c, потому что мне нужно, чтобы значение отображалось согласованно, чтобы я мог разместить URL на сервере. Это может быть связано с тем, что какая-то часть является асинхронной командой, как я могу это исправить?

1 Ответ

0 голосов
/ 24 апреля 2020

Создание процесса, а также чтение файла в NodeJS выполняется асинхронно, поэтому. Если вы хотите получить результат с непротиворечивостью, вам нужно использовать обратные вызовы. Когда вы охватываете процесс, вы можете получать данные из этого процесса в режиме реального времени с помощью

process.stdout.on("data", data => {
  //do whatever you want with data here
})

Если процесс python дает вам файл json, и вам нужно прочитать этот файл, вы должны прочитать его при выходе код 0, который Python процесс отправляет после завершения выполнения

 process.stderr.on('exit', function(code) {
       if(code ===0){
         fs.readFile('c.json', 'utf8', function (err, data) {
                    if (err) throw err;
                    res.send(data);
                })
        }
      })

Окончательный код должен быть таким:

app.get('/get_temp_hum', function(req, res) {
        var process = spawn('python',["ECIES_decotp.py"]);
        process.stdout.on('data', function(data) {
            // do whatever you want here with stream data from python process 
            console.log(data.toString());
        } )
        process.stderr.on('data', function(data) {
            console.log(data.toString());
        } )
        process.stderr.on('exit', function(code) {
            if(code === 0){
             fs.readFile('c.json', 'utf8', function (err, data) {
                if (err) throw err;
                res.send(data);
            })
         } 
        } )
});
...