1

我正在开发一个注册表单,我正在使用express-validator它来验证字段,但我在验证电子邮件是否已经存在时遇到了麻烦。

我做了一个选择来检查插入的电子邮件是否已经存在,但它总是返回我该电子邮件存在。

我尝试了其他方法,但没有奏效。

这是我的post request

routes.post('/register', function(req,res)
{
    var email = req.body.email;
    var username = req.body.username;
    var password = req.body.password;
    var password2 = req.body.password2;

    // Validation
    req.checkBody('email', 'Email is required').notEmpty();
    req.checkBody('email', 'Email is not valid').isEmail();
  req.checkBody('email', 'Email already exists').custom(value => {
    return User.findUserByEmail(value).then(function(user) {
      throw new Error('this email is already in use');
    })
  });

    req.checkBody('username', 'Username is required').notEmpty();
    req.checkBody('password', 'Password is required').notEmpty();
    req.checkBody('password2', 'Passwords do not match').equals(req.body.password);

    var errors = req.validationErrors();

    if(errors){
    console.log(errors);
        res.render('register',{
            errors:errors
        });
    } else {
    console.log("passed");

        var newUser = {
            email:email,
            username: username,
            password: password
        };


        User.createUser(newUser, function(err, User){
            if(err) throw err;
            console.log(User);
        });

        req.flash('success_msg', 'You are registered and can now login');

        res.redirect('/login');
    }
});

我的功能findUserByEmail

module.exports.findUserByEmail = function(email, callback){
  var connection = db.setDB('DB1');
  connection.then(result => {
    var request = new mssql.Request(conn);
    console.log("SELECT * FROM u_users WHERE email = '"+email+"'");
    var exists = request.query("SELECT * FROM u_users WHERE email = '"+email+"'");

    Promise.all([exists]).then(function(results)
    {

      console.log(results);
      if(results[0].length == 0)
      {
        console.log("1");
        return false;
      }
      console.log("2");
      return true;
    }).catch(function(err)
    {
      console.log("Error verifying email...");
      console.log(err);
    });
  });
}

如果我这样做,它会返回一个错误Cannot read property 'then' of undefined

我究竟做错了什么?

4

1 回答 1

0

关于 error Cannot read property 'then' of undefined.,发生这种情况是因为您没有从findUserByEmail函数中返回承诺。

除此之外,如果您保持原样,您的自定义验证器将始终失败。

findUserByEmail只返回true/ false,这意味着“用这个值解决这个承诺”。
您可能想要更改它以返回找到的用户(并使其名称暗示它的实际作用!):

module.exports.findUserByEmail = function(email, callback){

    var request = new mssql.Request(conn);
    console.log("SELECT * FROM u_users WHERE email = '"+email+"'");
    var query = request.query("SELECT * FROM u_users WHERE email = '"+email+"'");

    return query.then(function(results) {
      return results[0];
    }).catch(function(err) {
      console.log("Error verifying email...");
      console.log(err);
      throw err;
    });
}

现在您需要让您的自定义验证器检查是否从该函数返回了任何用户:

req.checkBody('email', 'Email already exists').custom(value => {
    return User.findUserByEmail(value).then(function(user) {
        if (user) {
            throw new Error('this email is already in use');
        }
    })
});

你完成了!

于 2018-02-20T02:02:59.897 回答