在Express.js中,我们如何使res.send等待从数据库中获取数据

时间:2019-05-22 22:09:21

标签: node.js express async-await

方法res.send()返回(空),然后从方法

从数据库(Mongodb)提取数据。
 Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {

如何在返回之前向其中添加等待或异步?

我正在学习节点/表达式,但无法在其他使用asyncawait,{{1 }}。

Promise

2 个答案:

答案 0 :(得分:2)

类似的事情应该起作用。

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

答案 1 :(得分:2)

必须res.send()回调内部而不是外部调用Skills.find()。但是,由于您要调用多个Skills.find(),因此需要跟踪返回了多少个回调。为此,您可以使用变量:

// Keep track of completed find():
var completed = 0;

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

        if (completed == branches.length) {
            var obj = {
                "status": "200",
                "message": "skills",
                "data": branchSkills
            }
            res.send(JSON.stringify(obj)); // INSIDE callback
        }
    }) // <--- note that callback ends here!
 }