使用express和node退出代码块

时间:2016-09-14 23:52:37

标签: javascript node.js mongodb express mongoose

这是我的代码

// on all routes that end with "users", do the following
router.route('/users')
    .post(function(req, res, next) {

        var user = new User();
        user.username = req.body.username;
        user.password = req.body.password;

        User.find({username : user.username}, function(err, results){
            if (results.length > 0) {

                //if (err) res.send(err);
                console.log('User exists: ', user.username);
                res.send('User exists');
                next();
            }

        });

        user.save(function(err) {
            if (err)
                res.send(err);

            res.json({
                message: 'Created user.',
                username: req.body.username,
                password: req.body.password
            });
        });

    })

User只是一个Mongoose架构。

如果在第一次回调中找到用户名,我想发送“用户存在”的基本响应,然后退出。现在我收到一个错误,因为它移动到user.save位并尝试向已经结束的响应写入更多信息。

如何完全退出User.find块和.post块?在普通的类C语言中,我只需执行return;,但这样做只会退出User.find块。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

尝试在else条件下编写另一个案例并返回这样的回调

 router.route('/users')
.post(function(req, res, next) {

    var user = new User();
    user.username = req.body.username;
    user.password = req.body.password;

    User.find({username : user.username}, function(err, results){
        if (results.length > 0) {

            //if (err) res.send(err);
            console.log('User exists: ', user.username);
            res.send('User exists');
             return next();
        }else{
            user.save(function(err) {
                if (err)
                    return res.send(err);

                return res.json({
                    message: 'Created user.',
                    username: req.body.username,
                    password: req.body.password
                });
            });
        }

    });

})

答案 1 :(得分:0)

在您当前的实现中,如果它找到了用户,它将运行您在回调中编写的任何内容。您的回调中恰好有next()next()将退出此路线并找到匹配的下一条路线。这意味着无论你写下什么,都不会被执行(我正在谈论user.save部分。

无论如何,要回答您的问题,如果您希望它同时退出User.find块和.post,那么只需将next()方法置于{{1}之下声明。

我希望这会有所帮助。