2016-07-26 22 views
0

我在註冊時有一個用戶名字段和一個電子郵件字段,我想在將用戶添加到數據庫之前檢查它們是否存在。大多數護照示例只查找一個字段,如用戶名,我不知道如何查找2.如果我按照我的要求做了以下操作,並且用戶輸入了現有的用戶名,但是不存在的電子郵件,則會通過該用戶,如果用戶輸入一個現有的電子郵件,但它會通過一個不存在的用戶名,因爲他們沒有用戶名。在數據庫中查詢護照配置中的兩個字段

我知道這是爲什麼發生。我只是無法弄清楚如何將2個查詢放在一起,所以只有當它看到沒有用戶名和/或沒有電子郵件時才保存它。更清楚的是,不應該有用戶名和電子郵件的重複。

我在想也許在else語句中設置一個變量,說可以保存用戶,然後在代碼中檢查是否有2個這些變量,如果有這些變量然後保存但我不不知道該怎麼做。我認爲這很難,因爲查詢是異步的。我希望我能做到這一點。

以及我將如何處理連接閃光消息?

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

有很多方法可以做到這一點。

例如,您可以使用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); 
       }); 
      } 
      }); 
     } 
     }); 
    }; 
+0

@jack空白不幸的是我無法測試上面的代碼因爲它只針對你的項目。請讓我知道它是否適合你。很高興再次看到。 –

+0

謝謝你的幫助和意見。它似乎工作,但我現在有問題發送2個Flash消息。在提供的鏈接中查看問題。我將不勝感激您繼續help.http://stackoverflow.com/questions/38597793/sending-2-flash-messages-when-to-queries-to-databse-show-that-fields-exist-in-pa –

+0

@針對其他問題添加了jackblank答案。 –

相關問題