使用expressJS检查数据库中的用户名和电子邮件

我正在尝试检查数据库中的电子邮件和用户名是否已经存在。 由于我使用mongoose和expressjs我只检查,如果数据库中的用户名已经存在,但我需要检查电子邮件和用户名,并返回一个合适的错误消息为每一个。 但我不知道如何检查它们。 这里我写了一些代码:

User.findOne({'用户名':用户名},function(错误,用户){

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); } 

使用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); } 

首先,您可能希望将此添加到您的模式,以确保所有的电子邮件都是小写,所以比较可以说是有道理的:

 email: { type: String, set: toLower } 

WhereLower是:

 function toLower (str) { return str.toLowerCase(); } 

然后,为了查找与用户名或电子邮件相匹配的文档,您可以使用MongoDB $or operator

所以查询将是这样的:

 User.find($or:[{username: username}, {email: email}]); 

由于您使用的是mongoose,我们可以使用pre中间件 ,在保存之前validation文档

所以你的代码可能是这样的:

 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简单和令人敬畏 。

您可以在Schema Mongoose中使用索引创build唯一的用户名和电子邮件。 或者你可以在这里阅读更多: http : //mongoosejs.com/docs/2.7.x/docs/indexes.html