好的,所以我使用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);
});
你需要在這裏使用的承諾,因爲你是用asynchrnous呼叫 – Sajeetharan
你面對的將獲得異步執行的承諾處理。 –
'.findOne'異步執行,所以'console.log(usernameTaken); //在調用回調之前,將不會執行輸出。 – hsfzxjy