我有一个mongo数据库,其中包含3个集合,分别用于User,Partner,Admin等3种类型的用户。每当有任何类型的新用户注册时,我都会搜索所有三个集合以检查用户名和电子邮件是否已经存在。我试图通过调用一个函数来实现这一点:
function checkAttribute(attr,val,callback){
User.find({attr: val},function(err,user){
if(err){
console.log(err);
}else{
if(user.length === 0){
Partner.find({attr: val},function(err,partner){
if(err){
console.log(err);
}else{
if(partner.length === 0){
Admin.find({attr: val},function(err,admin){
if(err){
console.log(err);
}else{
if(admin.length === 0){
return callback(null,true);
}else{
return callback(null,false);
}
}
});
}else{
return callback(null,false);
}
}
});
}else{
return callback(null,false);
}
}
});
};
调用函数行:
checkAttribute("username",newUser.username,function(error,response){
.......
});
但是这不起作用,因为即使已经存在使用用户名/电子邮件传递的用户,它也始终返回true。我找不到问题。有人知道为什么会这样吗? 预先感谢。
答案 0 :(得分:0)
class FirstViewController: UIViewController, DataEnteredDelegate {
...
}
将搜索名为attr:
的数据库字段。如果要使用功能参数attr
,请使用attr
作为键。
[attr]:
此功能自ES6起可用,因此应该可以正常工作。有关更多信息,请参见文档here
答案 1 :(得分:0)
由于您将属性作为变量传递给函数参数,因此查询文档
{ attr: val }
是具有键“ attr”的对象,而不是您传递的动态属性。
要解决此问题,您需要在查询对象中使用computed property names作为
{ [attr]: val }
此外,该函数可以使用异步/等待模式来提高可读性,并用于查找文档是否存在findOne
来完成此任务
以及如果存在则返回文档,否则返回null。
因此您的函数可以重构为
async function checkAttribute(attr, val, callback) {
try {
const query = { [attr]: val }
const user = await User.findOne(query).exec()
const partner = await Partner.findOne(query).exec()
const admin = await Admin.findOne(query).exec()
const found = (user || partner || admin) ? true: false
return callback(null, found)
} catch (err) {
console.error(err)
return callback(err, null)
}
};