【问题标题】:Nodejs formidable async mongoose await issueNodejs强大的异步猫鼬等待问题
【发布时间】:2020-11-23 13:28:48
【问题描述】:

我正在尝试对图像进行 OCR 解析。

所有的东西都很好,但我有一个问题,这个猫鼬和同步。

但不能在 mongoose find 调用中使用“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});
            
        }
    });

【问题讨论】:

  • 你试过数据库中的查询吗?请提供有关您导入的“Boses”的更多信息。
  • 是的,对数据库的查询有效!
  • 1. .find() 作为数组返回。所以'boss.name'将是无效的
  • 豺狼正确。我改为 findOne .... 仍然是同样的问题。事情不是在等待结果。

标签: node.js mongoose formidable


【解决方案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 });

    }
});

【讨论】:

  • 别让我......SyntaxError: await is only valid in async function
  • getTextFromImage(),这个函数是否返回一个承诺?我重新编辑代码,再试一次。
  • 尝试在代码中放置断点或console.log语句来调试哪一行出错。
【解决方案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});
                    }
                });

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 2018-08-30
    • 2019-05-10
    • 2021-04-20
    • 2018-04-13
    • 2019-02-15
    • 2018-06-11
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多