Я очень новичок в nodejs, что я пытаюсь сделать, это загрузить изображение с некоторыми данными в API nodejs, но прежде чем сохранять данные в Mongo DB, я пытаюсь сделать какой-то процесс для этого загруженного изображения с использованием класса Python, тогда я сохраню результаты в DB
поэтому я могу отправить загруженное изображение в код python и дождаться результата до сохранения любых данных в DB
мой код здесь
router.post('/img2text', upload.single('photo'), (req, res) => {
// Create the object for insertion into database
const Img2text = new img2text({
imgPath: req.file.path,
sender: req.body.sender,
processed: 0,
resultText: "no result",
});
/////////////////////////////////////////////////////////////start
var exec = require("child_process").exec;
exec('python uploads/hello.py ${req.file.path}',(error, stdout, stderr) => {
if (error) {
Img2text.processed=0;
Img2text.resultText='no result'
console.error('exec error: ${error}');
return;
}
console.log('stdout: ${stdout}');
Img2text.processed=1;
Img2text.resultText=stdout.toString('utf8');
console.log('stderr: ${stderr}');
console.log(req.query.firstname);
});
/////////////////////////////////////////////////////////end
// Save into database
Img2text.save((err) => {
// Check if error
if (err) {
res.json({ success: false, message: err });
} else {
console.log("img saved !!")
res.json({ success: true, message:img.resultText }); // Return success message
}
});
});
если код python занимает так много времени, мой объект будет пустым?
любой ответ будет высоко оценен
Вы пытались использовать Promise
, если не ссылаетесь на эту ссылку Promise MDN. Просто заверните свой процесс в Promise
и когда вы закончите процесс, решите его и сохраните в базе данных.
router.post('/img2text', upload.single('photo'), (req, res) => {
// Receive your image
let pythonProcess = new Promise((resolve, reject)=>{
// do your process
reolve() // resolve with updated data
})
pythonProcess.then(img =>{
//save to db
})
})
Теперь в вашем случае наилучшим образом, я предпочитаю использовать aync/await
Async/ aync/await
MDN. Не принимайте это как еще один способ сделать это, это просто современный способ использовать promise
. Как внутренне await
также наладить цепочку promise
. У вас есть оба варианта, либо вы можете пройти через promises
вам помогут в одном из лучших вещей в javascript
или если вы хотите, чтобы небольшой фрагмент кода шел с await
.
router.post('/img2text', upload.single('photo'), async(req, res) => { // To use await function need to be a async function
// Create the object for insertion into database
const Img2text = new img2text({
imgPath: req.file.path,
sender: req.body.sender,
processed: 0,
resultText: "no result",
});
/////////////////////////////////////////////////////////////start
var exec = require("child_process").exec;
await exec('python uploads/hello.py ${req.file.path}',(error, stdout, stderr) => {
if (error) {
Img2text.processed=0;
Img2text.resultText='no result'
console.error('exec error: ${error}');
return;
}
console.log('stdout: ${stdout}');
Img2text.processed=1;
Img2text.resultText=stdout.toString('utf8');
console.log('stderr: ${stderr}');
console.log(req.query.firstname);
});
/////////////////////////////////////////////////////////end
// Save into database
Img2text.save((err) => {
// Check if error
if (err) {
res.json({ success: false, message: err });
} else {
console.log("img saved !!")
res.json({ success: true, message:img.resultText }); // Return success message
}
});
});