在数据库中查询护照配置

时间:2016-07-26 05:39:11

标签: javascript node.js express passport.js passport-local

我在注册时有一个用户名字段和一个电子邮件字段,我想在将用户添加到数据库之前检查它们是否存在。护照的大多数示例只查找一个字段,如用户名,我无法弄清楚如何查找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);
                })
            }
        })
    }
))

1 个答案:

答案 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);
              });
            }
          });
        }
      });
    };