Как исправить «SyntaxError: await действителен только в асинхронной функции» - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь заставить свой метод post ждать завершения сценария python для файла, который только что загрузил пользователь.Я считаю, что проблема в том, что app.post не является асинхронным, но я не уверен, как сделать его асинхронным.

Я пробовал несколько модификаций следующего кода.

async function pythonScript(file, cb){
  try{ 
  var PythonShell = require('python-shell');


    // Use python shell
    var {PythonShell} = require('python-shell'); 
    console.log("Filename = " + File1)

    var options = {
        mode: 'text',
        args: [File1, File2, File3] 
    }; 

    PythonShell.run('pythonFile.py', options, function (err, results) {
        if (err) throw err;
        console.log(results[results.length-1]);
        result = results[results.length-1];
        output = result;
        console.log("output " + output);


    });
    return output;
  catch(error){
    console.log(error)
  }
}


app.post('/upload', async(req, res), (req, res) => {
  upload(req, res, (err) => {
    if(err){
      res.render('index', {
        msg: err
  });
} else {
  if(req.file == undefined){
    res.render('index', {
      msg: 'Error: No File Selected!'
    });
  } else {
    await pythonScript(file, cb).then(res.render('index', {
        file: `uploads/${req.file.filename}`,
        msg: 'File Uploaded! '+ output 
    }));

  }
  }
  });

});

Метод pythonScript должен быть завершен до рендеринга страницы, в противном случае переменная 'output' будет пустой (вывод задается в методе pythonScript.

Ответы [ 2 ]

0 голосов
/ 17 августа 2019

Я правильно вызывал функцию асинхронно, однако Python-Shell возвращал значение до завершения функции.Python-Shell возвращает blob / json после его вызова.Поэтому, когда я запускал его как асинхронный, он ожидал, однако, недостаточно долго, чтобы моя функция завершилась.

0 голосов
/ 24 декабря 2018

Вы должны объявить свой обратный вызов как асинхронный, чтобы использовать ожидание на них.Ваш правильный код должен быть

app.post('/upload', async (req, res) => {
  upload(req, res, async (err) => {
    if(err){
      res.render('index', {
        msg: err
      });
    } else {
      if(req.file == undefined) {
        res.render('index', {
          msg: 'Error: No File Selected!'
        });
      } else {
        await pythonScript(file, cb).then(res.render('index', {
          file: `uploads/${req.file.filename}`,
          msg: 'File Uploaded! '+ output 
        }));
      }
    }
  });

});
...