【问题标题】:How to know if MongoDB query using Mongoose returned a Document如何知道使用 Mongoose 的 MongoDB 查询是否返回了 Document
【发布时间】:2021-06-09 20:53:27
【问题描述】:

您好,我正在查询我的数据库中是否有用户。我在 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。 例如,如果用户存在,“用户”变量将接收从数据库返回的文档,但我不知道如何检查它是否未定义。

如果用户存在,它应该进入 if,但如果它不存在于数据库中,Mongoose 会返回什么?假,空,未定义?什么都没有?

如何检查查询没有返回任何文档?

有人知道吗?

感谢您的理解。

【问题讨论】:

  • 您定义了两次user,我还用更完整的代码更新了我的答案。由于 Node 是事件驱动的,它会使用回调来通知其他对象。
  • 好的。太感谢了。我会在这里尝试一切,我会发布结果。不,第一个用户从数据库中接收数据,第二个用户变量在其他文件中并接收函数返回的用户。

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


【解决方案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
  }

}

【讨论】:

  • 我非常感谢您的回答,但我可以从数据库中获取用户,因为我将其设置在 findOne 方法中,并使用另一个函数“getUserFound()”返回它,我可以打印用户对象。但即便如此,它也不会进入 if。 :/ 我更新了问题。
  • 回调的目的(在你的例子中是 setFoundUser() )是对结果做一些事情,尝试将它分配给其他东西或返回它不起作用。
  • 好吧,它最终会被分配给用户,但那是查询完成的时候。检查 if (user !== undefined) {//do something;} 在回调 (setFoundUser()) 之外。该检查将在调用 setFoundUser() 之前执行。因此,检查用户 !== undefined 或 !user 将始终为真,除非它像我上面的回答那样在回调 (setFoundUser()) 中移动。
【解决方案2】:

顺便说一句,您在代码中定义了两次 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);
}

即使建议使用以下方法检查是否为空...您必须确保该方法在检查变量之前完成。在 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)
}

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

【讨论】:

  • 我要试试。谢谢您的回答。 :)
  • 没问题,当您基本上检查空 obj 时,整个“未定义”与“空”的事情可能会很痛苦。
  • 你有机会尝试这个吗?
  • 还没有。我遇到了另一个问题。当我完成时,我会再次检查。
  • 更新了更彻底的答案
【解决方案3】:

虽然我使用的是异步函数和带有 mongoose 的 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;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多