首页 > 解决方案 > 在 Express.js 中,我们如何让 res.send 等待从数据库中获取数据

问题描述

res.send()在从方法中从数据库(Mongodb)中获取数据之前,该方法返回(空)

 Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {

我们如何在返回之前添加等待或异步?

我正在学习 node/express 并且无法在他们使用async, await, Promise.

const Skills = require('../models/skills.model.js');
const SkillBranch = require('../models/skillbranch.model.js');

exports.getSkills = function (req, res) {
   let branchSkills = [];       

   SkillBranch.find(function (err, branches) {         
     if (branches) {
        var obj = {
            "status": "200",
            "message": "skills",
            "data": branches
        }

        for (var i = 0; i < branches.length; i++) {                
            Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
                console.log(JSON.stringify(skills)); //this is returning after res.send()
                branchSkills.push(skills);                                        
            })

            if (i == branches.length - 1) {                    
                var obj = {
                    "status": "200",
                    "message": "skills",
                    "data": branchSkills
                }

                //this is returning before Skills.find() is complete
                res.send(JSON.stringify(obj));
            }
         }
     } else {
        var obj = {
            "status": "500",
            "message": "Getting skills ",
            "data": []
        }
        res.send(JSON.stringify(obj));
     }
  })
};

标签: node.jsexpressasync-await

解决方案


像这样的东西应该工作。

在 mongo 调用上创建一个承诺。完成后,只需将其转换为数组,将其推送到您的分支技能,并使用您的新更新版本解决承诺。然后使用新的更新版本发送数据,而不是您一直在使用的全局 branchSkills 对象。

应该注意的是,我不确定您使用分支技能的目的是什么,但是您可能skills无需推送到该全局数组即可解决?不过,这应该可以解决您的时间问题。

new Promise((resolve, reject) => {
  Skills.find({ skillbranch: branches[i]._id }).toArray((err, skills) => {
      if (err) {
        reject(err);
      } else {
        branchSkills.push(skills);
        resolve(branchSkills);
      }          
    });
  });
}).then(updatedBranchSkills => {
  if (i == branches.length - 1) {                    
    var obj = {
      "status": "200",
      "message": "skills",
      "data": updatedBranchSkills
  }

  res.send(JSON.stringify(obj));
});

推荐阅读