2017-02-28 33 views
0

我在這裏有點困惑這個寄存器route.As你可以看到我執行一些驗證檢查之前發送數據到數據庫。如何使它按順序工作?

首先,我正在檢查表單中的空字段,然後檢查記錄中的用戶名和電子郵件存在以及最後一次密碼確認。 所有這些東西都正常工作,但由於數據庫查詢應用程序的異步行爲每次崩潰。

/* POST Register User */ 
router.post('/register',function(req,res,next){ 

let user = req.body; 
//checking for empty field in a form 
for(let key in user){ 
    if(user[key] === ""){ 
     return next(mid.error("All fields are required to fill")); 
    } 
} 

User.findOne({username:user.username}) 
    .exec(function(err,user){ 
     if(err){ 
      return next(mid.error("Something went wrong")); 
     } 
     if(user){ 
      return next(mid.error("Username already exist")); 
     } 
}); 

User.findOne({email:user.email}) 
    .exec(function(err,user){ 
     if(err){ 
      return next(mid.error("Something went wrong")); 
     } 
     if(user){ 
      return next(mid.error("Email already exist")); 
     } 
}); 

//matching password 
if(user.password !== user.confirm){ 
    return next(mid.error("Password not matched.Try again !")); 
} 

//save data in object 
let userData = { 
    username : user.username, 
    email : user.email, 
    password : user.password 
}; 

//save data in database 

User.create(userData,function(err,user){ 
    if(err){ 
     return next(mid.error("Something went wrong.Try again !!!")); 
    } else { 
     req.session.userID = user._id; 
     return res.redirect('/home'); 
    } 

}); 

}); 

有沒有什麼辦法可以從中得到消除?

+0

可能的誘惑https://stackoverflow.com/questions/22485800/waiting-for-multiple-callbacks-in-node-js – JohnnyHK

回答

1

正如您所提到的,查詢是Asynchronous。 在這種情況下,您的findOne調用正在處理中,因爲findOne調用本身爲Synchronous,導致在查詢之一首先完成並執行回調時導致錯誤。您的回調然後返回並將所有內容傳遞到下一個中​​間件。

在第一次查詢完成回調之後,您可以放下所有想要發生的事情。在這種情況下:

User.findOne({username:user.username}) 
.exec(function(err, foundUser){ 
    if(err){ 
     return next(mid.error("Something went wrong")); 
    } 
    if(foundUser){ 
     return next(mid.error("Username already exist")); 
    } 
    User.findOne({email:user.email}) 
    .exec(function(err,foundUser){ 
     if(err){ 
      return next(mid.error("Something went wrong")); 
     } 
     if(foundUser){ 
      return next(mid.error("Email already exist")); 
     } 
     //HERE GOES ALL OTHER CODE THAT SHOULD HAPPEN AFTER THE QUERIES 
    }); 
}); 

注意,我改名回調內部user變量,以便它不用於查詢您的user對象發生衝突!

在未來,或者對於更復雜的用例,我會推薦使用Promises來避免這種深度嵌套回調。