我在注册时有一个用户名字段和一个电子邮件字段,我想在将用户添加到数据库之前检查它们是否存在。护照的大多数示例只查找一个字段,如用户名,我无法弄清楚如何查找2.如果我执行下面的操作,用户输入现有的用户名,但不存在的电子邮件将通过,如果用户输入现有的电子邮件,但输入的是不存在的用户名,因为它们不是用户名。
我知道为什么会这样。我只是无法弄清楚如何将2个查询放在一起,所以只有在看到没有用户名和/或没有电子邮件之后才能保存它。更清楚的是,应该没有重复的用户名和电子邮件。
我在想也许在else语句中设置一个变量,说可以保存用户,然后在代码检查中查看是否有2个这些变量,如果有那些变量那么保存但我没有&# 39;不知道该怎么做。我认为这很难,因为查询是异步的。我希望我能做那种方法。
我将如何处理connect-flash消息?
passport.use("local-signup", new LocalStrategy({
usernameField : "email",
passwordField : "password",
passReqToCallback : true
},
function(req, email, password, done){
User.findOne({"email" : email}, function(err, user){
if(err) return done(err);
if(user){
return done(null, false, req.flash("signupMessage", "That email is already taken"))
}else{
var newUser = new User();
newUser.username = req.body.username;
newUser.password = password;
newUser.email = req.body.email;
newUser.save(function(err, doc){
if(err) throw err;
console.log("doc", " " , doc)
return done(null, newUser);
})
}
})
console.log("username " + req.body.username)
User.findOne({"username" : req.body.username}, function(err, user){
if(err) return done(err);
if(user){
return done(null, false, req.flash("signupMessage", "that username is taken"))
}else{
var newUser = new User();
newUser.username = req.body.username;
newUser.password = password;
newUser.email = req.body.email;
newUser.save(function(err, doc){
if(err) throw err;
console.log("doc", " " , doc)
return done(null, newUser);
})
}
})
}
))
答案 0 :(得分:0)
有很多方法可以做到这一点。
示例,您可以promise
方式执行此操作;您可以同时执行和异步调用以检查用户名和电子邮件,如果两个调用都返回OK结果,然后继续插入。
查看:
强>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
由于你已经有了一些代码,我将逐步执行常规嵌套异步方式。
我在下面的内容是 - 首先拨打User.findOne()
来检查电子邮件,如果该值是唯一的,请再次使用User.findOne()
检查用户名。
当第二次User.findOne()
电话报告正常时,代码才会继续插入用户。
注意:虽然这个逻辑有效但是如果你嵌套太多的电话,你会进入Javascript社区通常描述的callback hell.
passport.use("local-signup", new LocalStrategy({
usernameField : "email",
passwordField : "password",
passReqToCallback : true
},
function(req, email, password, done){
// register user only if the email and username is unique
// Step 1: Check email
User.findOne({"email" : email}, function(err, user){
if(err) return done(err);
if(user){
return done(null, false, req.flash("signupMessage", "That email is already taken"))
} else {
// Email is fine.
// Step 2: Check username
User.findOne({"username" : req.body.username}, function(err, user){
if(err) return done(err);
if(user){
return done(null, false, req.flash("signupMessage", "that username is taken"))
}else{
// User name is fine too
// Step 3: Create user
var newUser = new User();
newUser.username = req.body.username;
newUser.password = password;
newUser.email = req.body.email;
newUser.save(function(err, doc){
if(err) throw err;
// User created
console.log("doc", " " , doc);
return done(null, newUser);
});
}
});
}
});
};