Node.JS Rethink-DB检查用户名和电子邮件是否已经存在

当我发现它不检查用户是否存在与电子邮件或用户名的东西是一个问题,我使用基于RethinkDB聊天例子的Node的login/注册系统工作。 当我正在寻求解决这个问题时,我无法找出原因,因为运行一个数据库检查将需要一个函数的callback,这使得它很难实现。

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

我需要帮助,如果一个用户存在一个用户名或邮件是相同的forms,它会发送一个:

  if (alreadyExists) { req.flash('error', 'That username/email is already in use.') res.redirect('/register'); return; } 

所以主要的问题是我必须知道它是否与其他函数存在相同的function,而不是callback。 任何帮助表示赞赏!

要检查具有给定电子邮件地址的用户是否存在,您必须在RethinkDB数据库中进行检查,该数据库是asynchronous的。 没有callback就无法实现,但并不是那么糟糕!

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

请注意,您将不得不为此创build一个辅助索引 。

你也应该考虑用POST请求而不是GET请求来发布表单。

我通常处理这样的事情的方式是:

 User.filter({username:req.body.username}).run().then(function(userArray){ if(userArray[0]){return res.status(500).json({Error : "Username is in use"});} 

我没有遇到任何问题使用callback。 是否有一个特定的原因,你试图避免它?

编辑:显然,在我的例子中replace用户名与任何你想检查,在你的情况下的电子邮件地址。 而这里的User是我的用户模型。 我也同意Tholle关于使用POST请求。 您不希望在查询string/ URL中发送用户的信息/凭证