2017-12-03 104 views
0

好的,所以我使用Node.js,ExpressJS和MongoDB來製作網站。我正在嘗試通過AJAX調用來檢查表單的有效性(因爲我想顯示輸入值是否在用戶輸入時隨時可用)。我已將所有這些達到了90%。唯一不起作用的是檢查用戶名和電子郵件是否已經存在或不在數據庫中。我的查詢是完美的,但是當我試圖存儲查詢給出的結果(無論是否在數據庫中)時,它不會發生。 這裏是我的代碼: -我的JavaScript變量沒有在Mongoose的.findOne()函數中設置

router.post('/signup',function(req, res){ 
    const username = req.body.username; 
    const email = req.body.email; 

    var response = []; 
    var usernameTaken, emailTaken; 

    User.findOne({username:username}, function(err, user){ 
    if (err) throw err; 
    if (Boolean(user)) { 
     console.log(user); // This works perfectly 
     usernameTaken = true; // This does not works at all! 
     console.log(usernameTaken); // Nor does this one. :/ 
    } else { 
     usernameTaken = false; 
    } 
    }); 

    console.log(usernameTaken); // No output 

    // Else part gets executed because usernameTaken does not sets to true. 
    if (usernameTaken) { 
    response.push({field: "username", type: "danger", message: "Sorry! This username is already taken :("}); 
    } else { 
    response.push({field: "username", type: "success", message: "This username is now yours ;)"}); 
    } 

    if (!isValid(email)) { 
    response.push({field: "email", type: "danger", message: "Please enter a valid E-mail Address."}); 
    } else { 
    response.push({field: "email", type: "success", message: "E-mail is valid."}); 
    } 

    User.findOne({email:email}, function(err, user){ 
    if (err) throw err; 
    if (Boolean(user)) { 
     console.log(user); // Again this works. 
     emailTaken = true; // But this does not works :(
    } else { 
     emailTaken = false; 
    } 
    }); 

    // Else part gets executed because emailTaken does not sets to true. 
    if (emailTaken) { 
    response.push({field: "email-avail", type: "danger", message: "This E-mail address is already registered!"}); 
    } else { 
    response.push({field: "email-avail", type: "success", message: "E-mail is valid."}); 
    } 

    res.send(response); 
}); 
+0

你需要在這裏使用的承諾,因爲你是用asynchrnous呼叫 – Sajeetharan

+0

你面對的將獲得異步執行的承諾處理。 –

+0

'.findOne'異步執行,所以'console.log(usernameTaken); //在調用回調之前,將不會執行輸出。 – hsfzxjy

回答

0

記住,像findOne或任何功能都異步地執行這意味着你把回調裏面不斷的執行步驟,他們將隨時得到執行。這就是爲什麼你的布爾值不在回調之外按預期打印的原因。

現在,您可以使用的一種方法是使用async/await,這將基本上確保您的代碼在承諾解決之前停止執行。所以,以一種使整個過程同步的方式。

ASYNC

AWAIT

試試這個。我使用async/await使過程同步。

router.post('/signup',async function(req, res){ 
    const username = req.body.username; 
    const email = req.body.email; 

    var response = []; 
    var usernameTaken, emailTaken; 

    const userNamePromise = new Promise((resolve, reject) => { 
    User.findOne({username:username}, function(err, user){ 
     if (err) reject(err); 
     if (Boolean(user)) { 
     resolve(true) 
     } else { 
     resolve(false); 
     } 
    }); 
    }) 

    usernameTaken = await userNamePromise; 

    console.log(usernameTaken); 

    if (usernameTaken) { 
    response.push({field: "username", type: "danger", message: "Sorry! This username is already taken :("}); 
    } else { 
    response.push({field: "username", type: "success", message: "This username is now yours ;)"}); 
    } 

    if (!isValid(email)) { 
    response.push({field: "email", type: "danger", message: "Please enter a valid E-mail Address."}); 
    } else { 
    response.push({field: "email", type: "success", message: "E-mail is valid."}); 
    } 

    const emailPromise = new Promise((resolve, reject) => { 
    User.findOne({email:email}, function(err, user){ 
     if (err) reject(err); 
     if (Boolean(user)) { 
     console.log(user); 
     resolve(true); 
     } else { 
     resolve(false); 
     } 
    }); 
    }) 
    emailTaken = await emailPromise; 

    if (emailTaken) { 
    response.push({field: "email-avail", type: "danger", message: "This E-mail address is already registered!"}); 
    } else { 
    response.push({field: "email-avail", type: "success", message: "E-mail is valid."}); 
    } 

    res.send(response); 
}); 
+0

我在'usernameTaken = await userNamePromise;'行收到一個錯誤。我搜索了這個錯誤,它顯示我們只能在異步函數內使用await。所以,我在承諾之後使用了'.then()'。現在,我得到了結果(真/假),但我不知道爲什麼'response.push()'不起作用。 –

+0

檢查我的代碼的第一行,並嘗試一次。 –

+0

@HemakshiSachdev添加異步後工作嗎? –

相關問題