如何知道使用Mongoose的MongoDB查询是否返回了一个Document

时间:2014-07-17 17:55:37

标签: node.js if-statement mongoose undefined mongodb-query

您好我正在进行查询以检查我的数据库中是否有用户。我在Node.JS中使用Mongoose。

这是我的疑问:

var user;
users.findOne({'fbUID': '1234'}, setFoundUser)

var setFoundUser = function(err, userFound){

if (err) return handleError(err);
user = userFound

}

好吧,我正在尝试检查查询的结果是否从数据库返回了一个文档。这是我检查它的方式:

function getUserFound(){
    return user;

}

var user= getUserFound();

if(user !== undefined ){...
   //do something
}

但是,即使我的查询返回一个文档,换句话说,用户存在,它也永远不会进入上面的if。       例如,如果用户存在,'user'变量将接收从DataBase返回的文档,但我不知道如何检查它是否未定义。

如果用户存在,它应该进入if,但如果数据库中不存在,那么Mongoose会返回什么? false,null,undefined?什么?

如何检查查询是否未返回任何文档?

有人知道吗?

感谢您的理解。

3 个答案:

答案 0 :(得分:1)

您在代码btw中定义了user两次。

您并不需要getUser();

的新功能

我建议做这样的事情(你可能需要toString()隐藏,但我很确定你没有:

var user;

function getUser(uid, callback) {
    users.findOne({'fbUID': uid}, function(err, userFound){

        if (err) return handleError(err);
        callback(userFound);
    });
}

getUser('1234', function(userAccount) {
    if (!userAccount) {
        //handle stuff
        return;
    }

    user = userAccount;
    // check to make sure the user is returned
    console.log(userAccount);
}

尽管建议使用以下方法检查null ...但是在检查变量之前必须确保方法完成。在Node ....中,东西与传统编程有点不同。

例如:

var record1 = dbCall1(); // takes 5 seconds to return a record
var record2 = [0,1,2]; // instant
if (!record1) {
    // this will always be true because this statement gets executed right away (not after the 5 seconds are up)
}

节点不会等待dbCall1()完成后再继续执行代码...这是我在我的示例中使用了回调。因此,在我的示例中...它知道该做什么以及如何通知您,因为它通知(callback)何时完成,以便您可以继续。

答案 1 :(得分:1)

问题是检查是否找到用户是findOne()回调的外部。当你这样做时:

if(user !== undefined ){...
   //do something
}

findOne()尚未完成。因此,用户未定义。这就是为什么它永远不会进入这个if语句。这个if语句应该在findOne()的回调中(在你的情况下是setFoundUser())。以下是修订后的代码:

users.findOne({'fbUID': '1234'}, setFoundUser)

var setFoundUser = function(err, userFound){

  if (err) return handleError(err);
  if (!userFound) {
    // inform caller that no user found
  } else {
    // user found, do something with userFound
    console.log(userFound);  // this should print the user object
  }

}

答案 2 :(得分:0)

尽管我使用的是异步函数和带有猫鼬的 nestsjs。

const sender = this.contactModel.findOne({account:transferDtos.sender});
if(!(await sender)){
   return "invald sender";
}else{
   return sender;
}

所以没有异步,我们可以做这样的事情

if(!sender){
    return "invalid sender";
 }else{
    return sender;
 }