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結果の配列を返すため、空であってif (data)も評価されます。true

findOneその一意のユーザー名とパスワードの組み合わせを持つ 1 人のユーザーだけを探しているため、より適切です。この方法は、一致する場合if (data)にのみ評価されます。trueUser

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 に答える
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 に答える