2016-04-08 52 views
0

声明:我是一个新的web开发者。猫鼬 - 一次使用findOne多次

我正在创建注册页面。有5个输入字段,其中3个(用户名,密码和电子邮件)要求他们通过各种形式的验证。这里是代码:

router.post('/register', function (req, res, next) { 
user.username = req.body.username; 
user.profile.firstName = req.body.firstName; 
user.profile.lastName = req.body.lastName; 
user.password = req.body.password; 
user.email = req.body.email; 

User.findOne({email: req.body.email}, function(err, existingEmail) { 

    if(existingEmail) { 
     console.log(req.body.email + " is already in use") 
    } else { 
     User.findOne({username: req.body.username}, function(err, existingUsername) { 
      if(existingUsername) { 
       console.log(req.body.username + " is already in use"); 
      } else { 
       user.validate({password: req.body.password}, function(err) { 
        if (err) { 
         console.log(String(err)); 
        } else { 
         user.save(function(err, user) { 
          if (err) { 
           return next(err); 
          } else { 
           return res.redirect('/') 
          } 
         }) 
        } 
       }); 
      } 
     }); 
    } 
}); 
}); 

基本上它首先检查,看它是否是重复的电子邮件;如果它是一个重复的电子邮件,它在console.log中是这样说的。如果它不是重复的电子邮件,它会检查用户名....然后进入密码。

问题是,它一次只做一件事;如果用户输入不正确的电子邮件和用户名,它只会说电子邮件不正确(它不会说电子邮件和用户名都不正确)。

我怎样才能得到这个验证所有3种形式在同一时间?

回答

1

您可以使用async并行运行他们,它也会使你的代码更加清晰,并采取回调地狱的护理:

var async = require('async); 

async.parallel([ 
    function validateEmail(callback) { 
    User.findOne({email: req.body.email}, function(err, existingEmail) { 
     if(existingEmail) { 
     callback('Email already exists'); 
     } else { 
     callback(); 
     } 
    } 
    }, 
    function validateUsername(callback) { 
    User.findOne({username: req.body.username}, function(err, existingUsername) { 
     if(existingUsername) { 
     callback('Username already exists'); 
     } else { 
     callback(); 
     } 
    } 
    }, 
    function validatePassword() { 
    user.validate({password: req.body.password}, function(err) { 
     if(err) { 
     callback(err); 
     } else { 
     callback(); 
     } 
    } 
    } 
], function(err) { 
    if(err) { 
    console.error(err); 
    return next(err); 
    } else { 
    user.save(function(err, user) { 
     if (err) { 
     return next(err); 
     } else { 
     return res.redirect('/'); 
     } 
    }); 
    } 
} 

这样,数组中的所有验证方法将并行运行,当所有的人都完成用户将被保存。

+0

感谢您的评论。我试着用你写的代码逐字记录,甚至尝试自己做出调整,但是我无法得到这个工作。如果我尝试在注册表单中输入2个错误(即我输入了重复的用户名和电子邮件),它会检测到电子邮件是重复的...然后浏览器运行不断(它永远不会说'用户名已存在',但浏览器继续循环,永远不会离开注册页面)。 – MonkeyOnARock

+0

这是因为如果有错误,我只是控制台登录它,没有发回回应,请检查更新。 – war1oc

0

如果您使用else语句,您选择按设计逐个进行检查(一次一个)。

为了实现“一次全部”行为,我不会使用else语句(如果可能,即对下一次检查错误不是致命的),但会在同一个块中执行所有测试,并会填充一个对象这样的:

errors: { 
    existingEmail: false, 
    existingUserName: false, 
    invalidUserName: false, 
    wrongPassword: false, 
    ... 
}; 

然后我会用它的形式显示用户的所有错误一起...

事情是这样的:

var errors = {}; 
if (existingEmail) { 
    console.log(req.body.email + " is already in use"); 
    errors.existingEmail: true; 
} 
User.findOne({username: req.body.username}, function(err, existingUsername) { 
    if (existingUsername) { 
     console.log(req.body.username + " is already in use"); 
     errors.existingUsername: true; 
    } else { 
     user.validate({password: req.body.password}, function(err) { 
      if (err) { 
       console.log(String(err)); 
       errors.invalidUsername = true; 
      } else { 
       user.save(function(err, user) { 
        if (err) { 
         return next(err); 
        } else { 
         return res.redirect('/') 
        } 
       }) 
      } 
     }); 
    } 
});