Python “如何修复”;SyntaxError:await仅在异步函数中有效;
我试图让我的post方法等待用户刚刚上传的文件上的python脚本完成。我相信问题是由于app.post不是异步的,但我不确定如何使其异步 我尝试了对以下代码的几次修改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')
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返回时(不是脚本完成时)