MEAN Stack app – 发送后无法设置标题

我基本上是试图创build一个使用MEAN注册页面,我想检查数据库(Mongo使用Mongoose),如果用户和电子邮件已经存在,如果其中一个是真的,发送res.json失败。

如果用户名和电子邮件不在数据库中,请继续添加用户。

我收到一个错误“发送后无法设置标题”。 在节点控制台上,我试图找出原因。

一旦User.getUsername()在callback中返回一个用户(如果用户名传递存在于数据库中),不应该返回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!'}); } }); }); 

由于asynchronous方法的工作方式,您所拥有的逻辑无法按预期工作。 当前的逻辑是做User.getUserByUsername然后做User.addUser ,如果任一方法callback,处理它。 我很确定你想要,做User.getUserByUsername ,等待它的callback,然后调用User.addUser如果有必要。 这是一个粗糙的实现,你可以使用promise或者定义逻辑外的方法来清理它。 此外,请确保您在代码中的某个时刻调用了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!'}); } }); } }); });