Python “如何修复”;SyntaxError:await仅在异步函数中有效;

Python “如何修复”;SyntaxError:await仅在异步函数中有效;,python,node.js,asynchronous,async-await,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')

我试图让我的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”变量将为空(output在pythonScript方法中设置。

必须将回调声明为异步才能对其使用wait。正确的代码应为

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

});

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

您需要声明回调以将其上载为ync:
async(err)=>{…
。在pythonScript完成之前,您仍在调用res.render。请将其移动到wait下方,而不是使用
然后
。感谢您的评论,我发现问题在于,当我的函数运行异步时,PythonShell总是在ri运行后立即吐出一些内容。如果如果其他人有此问题,请使用与我使用的代码和我使用的代码类似的代码,无论您在PythonShell.run参数中声明的结果是什么,在该值更改为其他值时使用check(我使用了等待)这将使函数等待直到实际找到结果,而不是PythonShell返回时(不是脚本完成时)