大家好我试图检查用户是否已经存在于数据库中,如果已经存在同名的用户,我已设法停止创建用户,但是我似乎没有显示错误消息。我不太清楚为什么我的错误没有得到正确处理。这是我的代码:
// Register User
router.post('/register', function(req, res){
var name = req.body.name;
var email = req.body.email;
var username = req.body.username;
var password = req.body.password;
var password2 = req.body.password2;
//Validation
req.checkBody('name', 'Name is required').notEmpty();
req.checkBody('email', 'Email is required').notEmpty();
req.checkBody('email', 'Email is not valid').isEmail();
req.checkBody('username', 'Username is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();
req.checkBody('password2', 'Passwords do not match').equals(req.body.password);
var errors = req.validationErrors();
if(errors){
res.render('register',{
errors:errors
});
}else{var newUser = new User({
name: name,
email:email,
username: username,
password: password
});
User.getUserByUsername(username, function(err, user){
if(err) throw err;
if(user){
return new Error('User already exists!');
}else{
User.createUser(newUser, function(err, user){
if(err) throw err;
console.log(user);
});
}
});
req.flash('success_msg', 'You are registered and can now login');
res.redirect('/users/login');
}
});
答案 0 :(得分:1)
这将完全按照您的意愿运行。我在尝试使其正常工作时遇到了同样的问题,我向您保证。干杯!
User.getUserByUsername(username, function(err, user){ //must check if user exists
if(err) throw err;
if(user){
console.log('existing...'); //may be deleted
req.flash('error_msg', 'This username already exists');
res.redirect('/users/register');
} else {
User.createUser(newUser, function(err, user){
if(err) throw err;
console.log(user);//may be deleted
});
req.flash('success_msg', 'You registered successfuly and you can now login');
res.redirect('/users/login');
}
})
答案 1 :(得分:0)
我看错了两件事:
在将控件传递给异步回调后,您正在执行同步操作
您没有对异步回调中的错误做任何有用的事情
此处异步回调是您传递给User.getUserByUsername
router.post('/register', function(req, res) {
...
User.getUserByUsername(username, function(err, user) {
// Any errors get thrown here need to be dealt with here
// Also you can't simply "throw" or "return" errors from this,
// You need to use Express's "next" method to handle these errors
})
// And since you've gone asynchronous above (User.getUserByUsername)
// you can't do the following here:
req.flash('success_msg', 'You are registered and can now login')
res.redirect('/users/login')
// otherwise these will ALWAYS get executed,
// regardless of what the result of `User.getUserByUsername` may be
})
你需要做这样的事情:
router.post('/register', function(req, res, next) { // use `next` to handle errors
...
User.getUserByUsername(username, function(err, user) {
if (err) {
next(err)
} else if (user) {
next(new Error('User already exists!'))
} else {
req.flash('success_msg', 'You are registered and can now login')
res.redirect('/users/login')
}
})
})
PS:您还没有保存newUser
(至少没有保存在您发布的代码中)
答案 2 :(得分:0)
var candidateName = username;
var queryforUsername = {};
queryforUsername['username'] = candidateName;
User.find(queryforUsername, function(err, item){
if(err) throw (err);
if(item.length > 0){
req.flash('error_msg', 'User with username '+username+' already exists!');
res.redirect('register');
}else if(item.length == 0){
User.createUser(newUser, function(err, user){
if(err) throw err;
console.log(user);
req.flash('success_msg', 'You are registered and can now login');
res.redirect('/users/login');
});
}
});
答案 3 :(得分:0)
如果您只想检查具有给定用户名的用户是否存在,那么我已经使用了这个简单的技巧。
我正在做的是注册时,如果发生某些错误,那么我正在检查此错误是否为UserExistError(与mongodb有关,您可以在终端中看到它)
如果err等于UserExistError,则我将呈现一个警报,该警报位于单独的文件中。
register(new User({username:req.body.username}),req.body.password,function(err,user){
if(err)
{ var chk=1;
console.log(err);
if(err=='UserExistsError');
console.log("error is here");
return res.render("register",{chk:chk});
}
passport.authenticate("local")(req,res,function(){
res.redirect("/dashboard");
})
});