我基本上尝试使用MEAN创建一个注册页面,如果用户和电子邮件已经存在,我想检查数据库(使用Mongoose的Mongo),如果其中一个是真的,则发送res.json失败。
如果用户名和电子邮件不在数据库中,请继续添加用户。
我收到错误“发送后无法设置标头。”在节点控制台上,我试图找出原因。
一旦User.getUsername()在回调中返回一个用户(如果在db中存在传递的用户名),它不应该返回json并在那里结束请求吗?为什么继续使用User.adduser()函数并尝试在那里设置标题?
感谢任何帮助,谢谢。
router.post('/register', (req, res, next) =>{
let newUser = new User({ // Collect body info
name: req.body.name,
email: req.body.email,
username: req.body.username,
password: req.body.password
});
// Check if username is available
User.getUserByUsername(newUser.username, (err, user) => {
if(err) throw err;
if(user){
return res.json({success: false, msg: 'User already exists'});
// I want to end here if there's a user
}
});
//Continue to add user if getUserByUsername() returns false for user
// Add user
User.addUser(newUser, (err, user) => { // Add user
if(err){
return res.json({success: false, msg: 'Failed to register'});
} else {
return res.json({success: true, msg: 'You have been successfully registered!'});
}
});
});
答案 0 :(得分:1)
由于异步方法的工作原理,您所拥有的逻辑无法按预期工作。当前逻辑是User.getUserByUsername
然后执行User.addUser
并且如果任一方法回调,则处理它。我很确定你想要,做User.getUserByUsername
,等待它的回调,然后在必要时调用User.addUser
。这是一个粗略的实现,你可以使用promises或定义逻辑之外的方法来清理它。另外,请确保在代码中的某个位置调用res.end()。
router.post('/register', (req, res, next) =>{
let newUser = new User({ // Collect body info
name: req.body.name,
email: req.body.email,
username: req.body.username,
password: req.body.password
});
// Check if username is available
User.getUserByUsername(newUser.username, (err, user) => {
if(err) throw err;
if(user){
return res.json({success: false, msg: 'User already exists'});
// I want to end here if there's a user
}else{
//Continue to add user if getUserByUsername() returns false for user
// Add user
User.addUser(newUser, (err, user) => { // Add user
if(err){
return res.json({success: false, msg: 'Failed to register'});
} else {
return res.json({success: true, msg: 'You have been successfully registered!'});
}
});
}
});
});