将Mongoose用作NodeJS的ODM,但不能完全理解错误处理的工作原理。它可以工作,但是看起来不正确,并且与文档不符,所以我担心走这条路以后会困扰我。

例如,这是基本的登录途径:

app.post('/signin', function(req, res){
    var email = req.body.email;
    var password = req.body.password;
    mongoose.model('User').findOne({
        email: email,
        password: password
    }, function(err, user){
        if (err){
            console.log('Database Error')
            return res.json({error: 'Database Error'})
        } else {
            if (!user) {
                console.log('User not found.');
                return res.json({error: 'Email and/or password incorrect.'})
            } else {
                console.log('User ' + user.email + ' found. Logging in.');
                res.json({
                token: jwt.sign({}, 'top-secret', {subject: user}),
                data: data[user]
                })
            }
        }
    })
})


我特别担心:

if (err) {
    //do something
} else {
    if (!user){
        //do something else
    } else {
        //log the user in
    }
}


在今天之前还没有真正使用过Mongo,但这感觉上有很多条件错误处理。这里有我不正确理解的东西吗?

最佳答案

本来打算发表评论,但将其粘贴为答案更容易。

由于可以在每个条件的末尾返回,因此可以简化if-else嵌套,如下所示:

app.post('/signin', function (req, res) {

    var email = req.body.email;
    var password = req.body.password;

    mongoose.model('User').findOne({
        email: email,
        password: password
    }, function (err, user) {

        if (err) {
            console.log('Database Error');
            return res.json({error: 'Database Error'});
        }
        if (!user) {
            console.log('User not found.');
            return res.json({error: 'Email and/or password incorrect.'});
        }
        console.log('User ' + user.email + ' found. Logging in.');
        res.json({
            token: jwt.sign({}, 'top-secret', {subject: user}),
            data: data[user]
        });
    });
});

09-30 19:16