首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何知道使用Mongoose的MongoDB查询是否返回了文档

如何知道使用Mongoose的MongoDB查询是否返回了文档
EN

Stack Overflow用户
提问于 2014-07-18 01:55:37
回答 3查看 1.7K关注 0票数 0

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

这是我的问题:

代码语言:javascript
运行
复制
var user;
users.findOne({'fbUID': '1234'}, setFoundUser)

var setFoundUser = function(err, userFound){

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

}

嗯,我正在尝试检查查询的结果,看看它是否从数据库返回了文档。这是我检查它的方法:

代码语言:javascript
运行
复制
function getUserFound(){
    return user;

}

var user= getUserFound();

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

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

如果用户存在,它应该放在if中,但是如果它不存在于数据库中,Mongoose返回什么?false、null、undefined没什么?

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

有人知道吗?

感谢您的理解。

EN

回答 3

Stack Overflow用户

发布于 2014-07-18 02:11:50

顺便说一下,您在代码中定义了两次user

你并不真的需要一个新的getUser();函数

我建议这样做(您可能需要对hid执行toString()操作,但我非常确定您不需要这样做:

代码语言:javascript
运行
复制
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);
}

尽管建议使用下面的代码来检查是否为空...在检查变量之前,必须确保方法完成。在节点中...stuff的工作方式与传统编程略有不同。

例如:

代码语言:javascript
运行
复制
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)
}

Node不会等到dbCall1()完成后才继续执行代码...这就是我在示例中使用的回调。所以,在我的例子中...它知道要做什么以及如何通知您,因为它会在完成时通知(callback),以便您可以继续。

票数 1
EN

Stack Overflow用户

发布于 2014-07-18 02:29:38

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

代码语言:javascript
运行
复制
if(user !== undefined ){...
   //do something
}

findOne()尚未完成。因此,用户未定义。这就是为什么它从不放在if语句中的原因。这个if语句应该在findOne()的回调函数中(在本例中是setFoundUser() )。下面是修改后的代码:

代码语言:javascript
运行
复制
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
  }

}

票数 1
EN

Stack Overflow用户

发布于 2021-06-09 20:53:27

虽然我使用的是异步函数和mongoose的嵌套。

代码语言:javascript
运行
复制
const sender = this.contactModel.findOne({account:transferDtos.sender});
if(!(await sender)){
   return "invald sender";
}else{
   return sender;
}

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

代码语言:javascript
运行
复制
if(!sender){
    return "invalid sender";
 }else{
    return sender;
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24810369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档