我正在尝试让我的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方法中设置了输出。
答案 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。因此,当我异步运行它时,它等待的时间不足以完成我的功能。