无法向对象添加属性 - Node.js / Mongoose

时间:2017-06-11 17:12:49

标签: node.js mongodb mongoose

我正在尝试检查用户模型或TempUser模型中是否已创建用户帐户,但遇到的问题是我无法将找到的值添加到对象以处理条件检查。

请检查以下代码和评论:

exports.isRegistered = function(userModel, tempUserModel, username){
    var obj = {}; //creating an empty object to add the found results later
    userModel.findOne({username: username}, function(err, user){
        if(err) throw err;
        if(user){
            obj.user = user;
            console.log(obj); // doesn't fire as no user was found found
        }else{
            tempUserModel.findOne({username: username}, function(err, tempUser){
                if(err) throw err;
                obj.tempUser = tempUser;
                console.log(obj); // returns object with a tempUser as it was found
            });
        }
    });
    console.log(obj); //returns an empty object again.
};

2 个答案:

答案 0 :(得分:1)

在看到代码和问题之后,我可以得出以下结论:

  

未触发,因为找不到用户

您确定User个集合是否具有给定用户名的这些对象?我不这么认为。请检查您是否提供了username的正确值以及具有该值的用户集合中存在的文档。

  

再次返回一个空对象。

回归总是有点难以理解。 好的,让我们打破你在代码中所做的步骤:

  1. 声明obj,为空白对象
  2. 在模型上调用findOne
  3. 记录obj,显示{},即空白对象
  4. 之所以发生这种情况,是因为第二步是异步。 这就是你的代码流动的方式,

    声明obj - >称为FineOne(但仍未执行回调) - >记录的Obj(仍为空白) - >执行FineOne操作的回调并在Obj中填充一些值

    我希望现在再清楚一点。我建议你阅读这些博客:

    在任何澄清的情况下,请允许我。 谢谢!

答案 1 :(得分:1)

您获得一个空对象,因为这两个查询是异步的。为了使用找到的参数返回正确的对象,您可以在查询中返回它。范围。您可以使用Promises来实现这一目标。

我会构建一个通用函数来对两个集合执行查找:

exports.isRegistered = (userModel, tempUserModel, username) => {
    let usr = {};
    findUser(username, userModel).then((user) => {
       if(user) {
           usr.user = user;
           return usr;
       }
       findUser(username, tempUserModel).then((user) => {
         if(user) {
           usr.tempUser = user;
           return usr;
         }
         return ({error : 'User Not Found'});
       }).catch((err) => {
          return err;
       });
    }).catch((err) => {
       return err;
    });
}

const findUser = (username, collection) => {
    return new Promise((resolve, reject) => {
      collection.findOne({username : username}).then((err, user) => {
        if(err) return reject(err);
        if(user) return resolve(user);
      });
    });
} 

您也可以将这两个调用放在一个数组中,解析它们并加入它们的结果,这样就可以更快地执行它们。