1

我正在使用快速会话登录用户。

中间件:

var requireLogin = function (req, res, next) {
    if (req.session.user) {
        next();
    } else {
        res.redirect('/'); 
    }
}

路线:

app.post('/login', requireLogin, routes.login);

exports.login = function (req, res) {
    var query = {username:req.body.username, password:req.body.password};

    User.find(query, function (err, data) {
        if (data) {
            req.session.user = data;
            console.log(data);
            res.redirect('/home');
        } else {
            console.log(err);
            res.redirect('/');
        }
    });
};

当我输入错误的用户名和密码时,它仍然会重定向到主页,但数据是null.

4

2 回答 2

1

find返回匹配结果数组并findOne返回匹配文档。

我想findOne适合这种情况。

app.post('/login', requireLogin, routes.login);

exports.login = function (req, res) {
    var query = {username:req.body.username, password:req.body.password}; 
    User.findOne(query, function (err, data) {
        if (data && !err) {
            req.session.user = data;
            console.log(data);
            res.redirect('/home');
        } else {
            console.log(err);
            res.redirect('/');
        }
    });
};
于 2012-08-22T01:49:09.710 回答
1

因为find返回一个结果数组,即使它是空的,if (data)仍然会评估为。true

findOne会更合适,因为您正在寻找具有该唯一用户名/密码组合的唯一用户。这种方式if (data)只会评估是否找到true匹配User项。

User.findOne(query, function (err, data) {
    if (err) {   
        // the username/password could be valid (or not), 
        // but there's no way to tell because there was some server error
        console.log(err);
        res.redirect('/');
    } else if (data) {
        // a user was found that matched the query
        req.session.user = data;
        console.log(data);
        res.redirect('/home');
    } else { 
        // there is no User that matches the query
        res.redirect('/');
    }
});
于 2012-08-22T05:26:30.477 回答