【问题标题】:Node.JS Rethink-DB check if username and email is already existNode.JS Rethink-DB 检查用户名和电子邮件是否已经存在
【发布时间】:2015-12-12 00:38:20
【问题描述】:

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

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

【问题讨论】:

    标签: node.js express connect rethinkdb rethinkdb-javascript


    【解决方案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 中发送用户的信息/凭据

    【讨论】:

      【解决方案2】:

      要检查具有给定电子邮件地址的用户是否存在,您必须检查您的 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 发布表单。

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 2015-02-28
        相关资源
        最近更新 更多