结合NodeJS中MongoDB集合的两个异步结果

时间:2017-12-05 16:00:33

标签: javascript node.js mongodb asynchronous mongoose

我确定以前曾问过这个问题,但由于某些原因我无法使其发挥作用。最近开始使用NodeJS和Mongoose(习惯于做所有异步) 我试图实现的一个目的是根据一些逻辑组合来自两个不同集合的两个结果。

假设我有这个get函数,它应该异步获取所有技能(例如),然后从另一个集合,我应该获取所有特定的用户技能,并将它们组合成一组结果,这将添加一个& #34; isSelected:真"在userSkills集合中找到的属性。这是用ES6编写的:

exports.get = (req, res) => {

const combineSkills = (allSkills)=>{
    const { userid } = req.headers;
     return UserSkills.GetUserSkills(userid).then((response)=>{
        for(var i=0;i<=response.length-1;i++){
           var userSkill = response[i];
           var found = allSkills.filter(e=>e.id==userSkill.skillId);
           if(found.length>0){
                found.isSelected=true;
           }
        }
        return allSkills;
    });
}

const respond = (response) => {
    res.json({
        ReturnCode: 2,
        ReturnObject: response
    })
}

// error occured
const onError = (error) => {
    res.status(403).json({
        ReturnCode: 0,
        ReturnObject: error.message
    })
}

Skills.GetAll()
    .then(combineSkills)
    .then(respond)
    .catch(onError)

}

正如你所看到的,我试图调用Skills.GetAll()技能,然后得到结果到combineSkills对象,做一些逻辑并返回新对象。 我知道我的问题在于combineSkills函数,其中我的return语句在逻辑更改之前返回对象。

我的问题是这种情况的正确语法是什么?

1 个答案:

答案 0 :(得分:0)

filter函数返回一个数组,你必须使用find方法返回所需的技能,如:

  const combineSkills = (allSkills) => {
      const { userid } = req.headers;
      return UserSkills.GetUserSkills(userid).then((response) => {
        for (var i = 0; i <= response.length - 1; i++) {
          var userSkill = response[i];
          var found = allSkills.find(e => e.id == userSkill.skillId);
          if (found) {
            found.isSelected = true;
          }
        }
        return allSkills;
      });
    }