【问题标题】:MEAN Stack app - Can't set headers after they are sentMEAN Stack 应用程序 - 发送后无法设置标题
【发布时间】:2017-07-17 11:55:43
【问题描述】:

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

如果数据库中还没有用户名和邮箱,继续添加用户。

我收到一条错误消息“发送后无法设置标头。”在 Node 控制台上,我试图找出原因。

一旦 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!'});
        }
    });

});

【问题讨论】:

    标签: json node.js mongodb angular mean-stack


    【解决方案1】:

    由于异步方法的工作方式,您的逻辑无法按预期工作。当前的逻辑是做User.getUserByUsername 然后做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!'});
                    }
                });
            }
        });
    });
    

    【讨论】:

    • 非常感谢!是的,这就是我想实现它的方式。但是,我认为一旦添加了 checkKIfEmailExists() 方法,它就会变得非常混乱。我现在可以工作了,它检查用户名的唯一性,在回调内部,它检查电子邮件,在检查电子邮件回调内部,如果用户名和电子邮件都很好,它会添加用户。它有效,但非常混乱且难以阅读
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多