Грозная проблема ожидания асинхронного мангуста Nodejs

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