#node.js #mongoose #formidable
#node.js #мангуст #грозный
Вопрос:
Я пытаюсь выполнить синтаксический анализ изображения.
Все работает хорошо, но у меня проблема с этим мангустом и синхронизацией.
Но не могу использовать «await» при вызове поиска мангуста, поскольку функция не является асинхронной. Как мне это решить.
Вот мой код:
// post processImage
router.post('/', async (req, res) => {
try {
var baseUrl;
const form = formidable({ multiples: true });
form.parse(req, function (error, fields, files) {
var imatgeAProcessar = files.image.path;
var extname = path.extname(files.image.name);
getTextFromImage(imatgeAProcessar) // OCR process of the image
.then(res => {
const boss_name_req = res.boss_name;
const boss = Boses.findOne({"name" : boss_name_req}).exec();
// ERROR HERE // return nothing althought it exist on database (no await?)
console.log(JSON.stringify(boss)); // writes "{}"
const processedImage = {
"success": true,
"boss_name": boss.name,
"boss_image": baseUrl 'images/' boss.num ".png"
}
res.json(processedImage);
})
});
} catch (err) {
res.json({message: err});
}
});
Комментарии:
1. Вы пробовали запрос в базе данных? И, пожалуйста, предоставьте больше информации о «Бозах», которые вы импортировали.
2. да, запрос к базе данных работает!
3. 1. .find() возвращает в виде массива. итак ‘boss.name » было бы недействительным
4. Шакал исправлен. Я изменил на findOne …. все та же проблема. Дело не в ожидании результата.
Ответ №1:
* отредактировано
// post processImage
router.post('/', async(req, res) => {
try {
var baseUrl;
const form = formidable({ multiples: true });
var formfields = await new Promise(function(resolve, reject) {
form.parse(req, function(err, fields, files) {
if (err) {
reject(err);
return;
}
resolve(files);
}); // form.parse
});
var imatgeAProcessar = formfields.image.path;
var extname = path.extname(formfields.image.name);
const res = await getTextFromImage(imatgeAProcessar)
const boss_name_req = res.boss_name;
const boss = await Boses.findOne({ "name": boss_name_req }).limit(4).skip(0).exec();
const processedImage = {
"success": true,
"boss_name": boss.name,
"boss_image": baseUrl 'images/' boss.num ".png"
}
res.json(processedImage)
} catch (err) {
res.json({ message: err });
}
});
Комментарии:
1. Не позволяйте мне…. Ошибка синтаксиса: ожидание допустимо только в асинхронной функции
2. getTextFromImage(), возвращает ли эта функция обещание? и я повторно редактирую код, попробую еще раз.
3. Попробуйте установить точку останова или консоль. оператор журнала в коде для отладки, какая строка идет не так.
Ответ №2:
Наконец-то я нашел способ… Я написал обратный вызов для вызова findOne как :
const boss = Boss.findOne({"name" : boss_name_req})
.then( resMongoose => {
try {
const processedImage = {
"success": true,
"gym": resOCR.gym,
"boss_name": resMongoose.name,
}
res.json(processedImage);
} catch (err) {
res.json({message: err});
}
});