您好,我正在做一个查询,以检查我的数据库中是否有用户。我在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没什么?
如何检查查询是否未返回任何文档?
有人知道吗?
感谢您的理解。
发布于 2014-07-18 02:11:50
顺便说一下,您在代码中定义了两次user
。
你并不真的需要一个新的getUser();
函数
我建议这样做(您可能需要对hid执行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);
}
尽管建议使用下面的代码来检查是否为空...在检查变量之前,必须确保方法完成。在节点中...stuff的工作方式与传统编程略有不同。
例如:
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
),以便您可以继续。
发布于 2014-07-18 02:29:38
问题是检查是否在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
}
}
发布于 2021-06-09 20:53:27
虽然我使用的是异步函数和mongoose的嵌套。
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;
}
https://stackoverflow.com/questions/24810369
复制相似问题