1

你好 Stackoverflow 社区,我是 Node.js / express 的新手,我需要你的帮助,因为我遇到了一些问题。

我正在尝试进行注册过程,将 Post 输入保存到 mongodb 中。在我想验证用户的电子邮件地址是否已经存在于数据库中之前。

如果我尝试在 db.users.find() 语句中定义一个 var,则该应用程序将无法工作。

 app.post("/sign-up", function(req, res){

    var validate;

    db.users.find({email : req.body.email}, function(err, users) {
      if( err || !users){
                    validate = true;
      }else{
            validate = false;
            }
    });

    console.log(validate);

    if(validate == true){
            db.users.save({
                           title: req.body.title,
                           firstname: req.body.firstname,
                           surname: req.body.surname,
                           country : req.body.country,
                           email: req.body.email,
                           password: bcrypt.hashSync(req.body.password, 10)
                                       }, 
                           function(err, saved) {
                                              if( err || !saved ) console.log("User not saved");
                                              else console.log("User saved");
                                              res.location("sign-up-success");
                                              // And forward to success page
                                              res.redirect("sign-up-success");
                                            });
             }
 });

db.users.find() 函数的外观如何,我可以为 db.users.save() 函数发出 if/else 请求。

4

2 回答 2

2

问题是这db.users.find是一个异步函数。我将建议以下内容:

app.post("/sign-up", function(req, res){
  var validateUser = function(callback) {
    db.users.find({email : req.body.email}, function(err, users) {
      if( err || !users){
        callback(true);
      } else {
        callback(false);
      }
    });
  }
  validateUser(function(isValid) {
    if(isValid == true){
      db.users.save({
        title: req.body.title,
        firstname: req.body.firstname,
        surname: req.body.surname,
        country : req.body.country,
        email: req.body.email,
        password: bcrypt.hashSync(req.body.password, 10)
      }, function(err, saved) {
        if( err || !saved ) console.log("User not saved");
        else console.log("User saved");
        res.location("sign-up-success");
        // And forward to success page
        res.redirect("sign-up-success");
      });
    }
  })
 });
于 2014-01-07T10:09:48.513 回答
1

这是异步问题,您可以将一些代码移动到您的 find 回调中,如下所示:

 app.post("/sign-up", function(req, res){
    var validate;
    db.users.find({email : req.body.email}, function(err, users) {
        if( err || !users){
            validate = true;
        }else{
            validate = false;
        }

        // your code should be here:
        console.log(validate);

        if(validate == true){
        ....
        }

    });


    // This code will print undefined, so you must move to the callback 
    // console.log(validate)
    // because the callback was not call yet
于 2014-01-07T10:01:46.753 回答