您好我正在进行查询以检查我的数据库中是否有用户。我在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?什么?
如何检查查询是否未返回任何文档?
有人知道吗?
感谢您的理解。
答案 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;
}