Json 平均堆栈应用程序-Can';t在发送邮件后设置邮件头

Json 平均堆栈应用程序-Can';t在发送邮件后设置邮件头,json,node.js,mongodb,angular,mean-stack,Json,Node.js,Mongodb,Angular,Mean Stack,我基本上是在尝试使用MEAN创建一个注册页面,我想检查数据库(Mongo使用Mongoose),如果用户和电子邮件已经存在,如果其中一个是真的,发送res.json失败 如果用户名和电子邮件不在数据库中,请继续添加用户 我在节点控制台上收到一个错误“发送后无法设置头”,我正在试图找出原因 一旦User.getUsername()在回调中返回一个用户(如果传递的用户名存在于数据库中),它不应该返回json并在那里结束请求吗?为什么要继续使用User.adduser()函数并尝试在那里设置头呢 非常

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

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

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

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

});

由于异步方法的工作方式,您拥有的逻辑无法按预期工作。当前的逻辑是do
User.getUserByUsername
然后do
User.addUser
,如果其中一个方法回调,则处理它。我很确定您需要,执行
User.getUserByUsername
,等待它的回调,然后在必要时调用
User.addUser
。这是一个粗略的实现,您可以使用承诺或在逻辑之外定义方法来清理它。另外,请确保在代码中的某个点调用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!'});
                }
            });
        }
    });
});

谢谢!是的,我就是这么想的。但是,我认为一旦添加checKIfEmailExists()方法,它会非常混乱。我现在已经开始工作了,它检查用户名的唯一性,在回调中,它检查电子邮件,在检查电子邮件回调中,如果用户名和电子邮件都很好,它会添加用户。它可以工作,但它非常混乱,不可读