我正在使用基于 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;
}
所以主要问题是我必须知道它是否存在于与其他函数相同的函数中而不是回调中。如有任何帮助,我们将不胜感激!
我通常处理此类事情的方式是:
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 中发送用户的信息/凭据
要检查具有给定电子邮件地址的用户是否存在,您必须在 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.
}
})
}
请注意,您必须为此创建一个辅助索引。
您可能还应该考虑使用 POST 请求而不是 GET 请求来发布表单。