nodejsexpress登录失败

nodejs express login fail

本文关键字:失败 登录 nodejsexpress      更新时间:2023-09-26

我正在使用express会话登录用户。

中间件:

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

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('/');
        }
    });
};

因为find返回一个结果数组,所以即使if (data)为空,它仍将计算为true

findOne更合适,因为您只需要查找一个具有唯一用户名/密码组合的用户。这样,如果找到匹配的User,则if (data)将仅评估为true

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('/');
    }
});