簡體   English   中英

嘗試為Express中的用戶登錄身份驗證編寫代碼,無法使用節點中的Express-Session登錄

[英]Trying to code for user login authentication in express, not able to login from using express-session in node

我正在嘗試使用Express-Session在Express中編寫用於用戶登錄身份驗證的代碼

這是我的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.js中req.user得到的是空值,這就是為什么我無法登錄。 但是在account.js req.user中獲得的用戶數據未反映在server.js中。

同樣,如果在accounts.js,我把下一個()if(req.session.userId)語句中,我能夠得到server.js用戶數據,但在注銷創設問題。

請幫助我。

您的accounts.js在集合查詢返回之前正在執行next() ,因此稍后在中間件中未定義req.user是有意義的。 要解決此問題,請嘗試以下操作:

.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這樣進行用戶登錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM