如何修复“ SyntaxError:等待仅在异步功能中有效”

时间:2018-12-24 01:09:49

标签: python node.js asynchronous async-await

我正在尝试让我的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 :(得分:0)

您必须将回调声明为异步,以对其使用await。您的正确代码应为

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 
        }));
      }
    }
  });

});

答案 1 :(得分:0)

我正确地异步调用了该函数,但是,Python-Shell在函数完成之前返回了一个值。一旦被调用,Python-Shell将返回blob / json。因此,当我异步运行它时,它等待的时间不足以完成我的功能。