当我发现它没有检查用户是否存在电子邮件或用户名是否有问题时,我使用基于RethinkDB Chat示例的Node登录/注册系统。 当我想要解决这个问题时,我无法找到原因,因为运行数据库检查需要使用函数回调,这使得它很难实现。
if (typeof req.user !== 'undefined') {
res.redirect('/account');
return;
}
if (!validateEmail(req.param('email'))) {
req.flash('error', 'Not a valid email address!')
res.redirect('/register');
return;
}
// Add a check for EMAIL/USERNAME here.
if (req.param('password') !== req.param('password2')) {
req.flash('error', 'Passwords does not match!')
res.redirect('/register');
return;
}
如果用户存在的用户名或邮件与其发送的表单中的用户名或邮件相同,我需要提供帮助:
if (alreadyExists) {
req.flash('error', 'That username/email is already in use.')
res.redirect('/register');
return;
}
所以主要问题是我必须知道它是否存在于与其他函数相同的函数中,而不是在回调函数中。任何帮助表示赞赏!
答案 0 :(得分:1)
我通常处理这样的事情的方式是:
User.filter({username:req.body.username}).run().then(function(userArray){
if(userArray[0]){return res.status(500).json({Error : "Username is in use"});}
我没有遇到任何使用回调的问题。您是否有特定原因试图避免它?
修改:显然,在我的示例中将用户名替换为您要检查的内容,在您的案例中是电子邮件地址。 User
这是我的用户模型。我也同意Tholle关于使用POST请求。您永远不想在查询字符串/ URL中发送用户的信息/凭证
答案 1 :(得分:0)
要检查具有给定电子邮件地址的用户是否存在,您必须检查RethinkDB数据库,这是异步的。没有回调就无法实现这一点,但它并没有那么糟糕!
var r = require('rethinkdbdash')();
function getUserByEmailAddress(emailAddress) {
return r.db('test').table('user')
.getAll(emailAddress, {index: 'emailAddress'}).run();
}
app.post('/register', function(req, res) {
// User already has a session. Not allowed to log in.
if(req.user) {
return res.redirect('/account');
} else if(!validateEmail(req.body.emailAddress)) {
return res.status(500).send('Not a valid email address');
} else if(req.body.password !== req.body.password2) {
return res.status(500).send('Passwords do not match');
}
getUserByEmailAddress(req.body.emailAddress).then(function(user) {
if(user) {
res.status(500).send('User with given email address already exists');
} else {
// New email address! Encrypt password, add to db, etc.
}
})
}
请注意,您必须为此创建secondary index。
您可能还应考虑使用POST-request instead of a GET-request发布表单。