我正在尝试检查数据库中的电子邮件和用户名是否已存在。由于我使用的是mongoose和express.js,我只检查数据库中的用户名是否已经存在,但是我需要检查电子邮件和用户名并为每个用户返回一个合适的错误消息。但是,我不知道如何检查它们。以下是我到目前为止编写的一些代码:
User.findOne({
'username': username
},
function(err, user) {
if (err) {
console.log('Signup error');
return done(err);
}
//if user found.
if (user) {
console.log('Username already exists, username: ' + username);
var err = new Error();
err.status = 310;
return done(err);
}
答案 0 :(得分:5)
首先,您可能希望将此添加到架构中以确保所有电子邮件都是小写的,因此比较可能有意义:
email: { type: String, set: toLower }
以下的地方:
function toLower (str) {
return str.toLowerCase();
}
然后,要查找MongoDB以查找与用户名或电子邮件匹配的文档,您可以使用MongoDB $or
operator
所以查询将是这样的:
User.find($or:[{username: username}, {email: email}]);
由于您使用的是猫鼬,我们可以使用pre middleware在保存之前验证文档
所以你的代码可能是这样的:
UserSchema.pre('save', function(next){
var user = this ;
User.find($or:[{username: user.username}, {email: user.email}],
function(err, users){
if(err) {
return next(err);
} else if(users) {
if (_.find(users , {email: user.email})){
user.invalidate('email', 'email is already registered');
next( new Error("email is already registered"));
}
else if (_.find(users , {username: user.username})){
user.invalidate('username', 'username is already taken');
next( new Error("username is already taken"));
}
}
else{
next();
}
})
})
这可能不会涵盖所有情况,并使用lodash来简化及其非常棒。
答案 1 :(得分:0)
使用find()函数,这可能会给你完美的结果
User.find({ 'username': username,'email':email }, function(err, user) {
if (err) {
console.log('Signup error');
return done(err);
}
//if user found.
if (user.length!=0) {
if(user[0].username){
console.log('Username already exists, username: ' + username);
}else{
console.log('EMAIL already exists, email: ' + email);
}
var err = new Error();
err.status = 310;
return done(err);
}
答案 2 :(得分:0)
您可以在Schema Mongoose中使用索引来创建唯一的用户名和电子邮件。 或者你可以在这里阅读更多内容:http://mongoosejs.com/docs/2.7.x/docs/indexes.html