1

我在基于 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;
  }

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

4

2 回答 2

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 中发送用户的信息/凭据

于 2015-12-11T16:12:31.400 回答
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.
    }
  })
}

请注意,您必须为此创建二级索引

您可能还应该考虑使用POST-request 而不是 GET-request发布表单。

于 2015-12-04T17:23:09.413 回答