【问题标题】:Combining two async results from MongoDB collection in NodeJS在 NodeJS 中结合来自 MongoDB 集合的两个异步结果
【发布时间】:2017-12-05 16:00:33
【问题描述】:

我确定以前有人问过这个问题,但由于某种原因我无法让它工作。最近开始使用带有 Mongoose 的 NodeJS(习惯于异步执行所有操作) 我想要实现的一件事是根据某种逻辑组合来自两个不同集合的两个结果。

所以假设我有这个get函数,它应该异步获取所有技能(例如),然后从另一个集合中,我应该获取所有特定的用户技能,并将它们组合成一组结果,这将添加一个“在 userSkills 集合中找到 isSelected:true" 属性。这是用 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 语句在逻辑更改之前返回对象。

我的问题是这种场景的正确语法是什么?

【问题讨论】:

    标签: javascript node.js mongodb asynchronous mongoose


    【解决方案1】:

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

    【讨论】:

    • 两者都有效。查找/过滤。因为我收集的“allSkills”是独一无二的。所以我假设为了继续找到一些东西/任何东西。我的问题是异步调用的编写方式,而不是这个逻辑。
    • @Basilf 过滤器不会工作,除非你这样做found[0].isSelected=true;
    • 不可能,因为 combineSkills 函数会返回这个函数:在到达“Then”之前返回 UserSkills.GetUserSkills(userid)。这样我所有的逻辑都是无用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多