簡體   English   中英

在Express.js中,我們如何讓res.send等待從數據庫中獲取數據

[英]In Express.js how can we make res.send to wait for data to be fetched from database

方法res.send()在從方法從數據庫(Mongodb)獲取數據之前返回(空)

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

如何在返回之前添加await或async?

我正在學習node / express,並且無法在stackoverflow上的其他帖子中使用asyncawaitPromiseasync語法來使用一些答案/示例。

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

這樣的事情應該有效。

在mongo調用上創建一個promise。 完成后,只需將其轉換為數組,將其推送到您的分支技能,並使用新的更新版本解決承諾。 然后使用新的更新版本而不是您一直使用的全局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));
});

必須Skills.find()回調中調用res.send() ,而不是在它之外。 但是,由於您正在調用多個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!
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM