1

Express-session を使用してエクスプレスでユーザーログイン認証のコードを書こうとしています。

これは私の accounts.js API です

.use(bodyParser.urlencoded())
.use(bodyParser.json())
.use(session({ secret: 'hcdjnxcds6cebs73ebd7e3bdb7db73e' }))
.get('/login', function (req, res) {
    res.sendfile('public/login.html');
})
.post('/login', function (req, res) {
        var user = {
            username : req.body.username,
            password : hash(req.body.password)
        };
        var collection = db.get('users');
        collection.findOne (user, function (err, data) {
            if (data) {
                req.session.userId = data._id;
                res.redirect('/');
            } else {
                res.redirect('/login');
            }
        });
})
.get('/logout', function (req, res) {
        req.session.userId = null;

        res.redirect('/');
})
.use(function (req, res, next) {
        if (req.session.userId) {
            var collection = db.get('users');
            collection.findOne({ _id : new ObjectId(req.session.userId)}, function (err, data) {
                req.user = data;
            });
        }
        next();
});

module.exports = ルーター;

そして、これは私のserver.jsコードです

var express = require('express'),
    api         = require('./api'),
    users       = require('./accounts'),
    app         = express();

app
    .use(express.static('./public'))
    .use('/api', api)
    .use(users)
    .get('*', function (req, res) {
            if (!req.user) {
                res.redirect('/login');
            } else {
                res.sendfile(__dirname + '/public/main.html');
            }
    })
    .listen(3000);

私の問題は、server.jsreq.userが null 値を取得しているため、ログインできないことです。しかし、account.js req.user では、server.js に反映されていないユーザー データを取得しています。

繰り返しますが、 accounts.jsでif (req.session.userId)ステートメント内にnext()を配置すると、server.js でユーザー データを取得できますが、ログアウト時に問題が発生します。

これで私を助けてください。

4

1 に答える 1

0

accounts.jsコレクションクエリが返される前に実行しているため、後でミドルウェアでreq.usernext()が未定義であることは理にかなっています。それを修正するには、これを試してください:

.use(function (req, res, next) {
        if (req.session.userId) {
            var collection = db.get('users');
            collection.findOne({ _id : new ObjectId(req.session.userId)}, function (err, data) {
                req.user = data;
                next();
            });
        } else {
            next();
        }
});

補足として、ユーザー ログインを自分で実装することで、ここで車輪を再発明しています。このようなユーザー ログインを行うには、 passportjsを参照することをお勧めします。

于 2015-04-29T20:18:19.030 に答える