req.user未定义,但登录正常

时间:2019-06-06 06:06:49

标签: javascript mysql node.js express passport.js

背景

我知道这个问题被问了一百万遍,但是这些问题都没有解决我的问题。在我的应用程序路由中,无论我访问哪个路由,调用req.user都只会返回未定义。

如果有帮助,我的登录功能也可以正常工作。我有登录/不登录时更改客户端的特定元素,但是无论如何req.user都返回undefined。

正如许多人指出的那样,这可能是我的中间件订购中的一个小问题,但是由于我的订购实际上是从大约3个不同的地方复制/粘贴的,所以我一生都找不到它地方。

我的应用程序的总体布局是一个主文件app.js,该文件设置了我的快速应用程序并包含我的所有路线。我所有的路线都在中间件设置下方。


相关的app.js代码

// Middleware
// Setup DB Pool and app
var pool = mysql.createPool(db.pool);
var app  = express();

// Setup Handlebars
app.engine('handlebars', exprhbr({defaultLayout: 'index'}));
app.set('view engine', 'handlebars');
app.use(express.static('public'));

// Setup body parser
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Setup session
app.use(session({
    cookie: { maxAge: 60000 },
    secret: 'spooky',
    resave: true,
    saveUninitialized: true
}));

// Setup passport
app.use(passport.initialize());
app.use(passport.session());

...

// An example route
app.get('/', (req, res) => {
    let loggedIn = req.isAuthenticated(); // works perfectly
    console.log('user: ', req.user); // always prints "user: undefined"

    res.status(200).render('home', {
        page:     'Home',
        noSearch: true,
        loggedIn: loggedIn,
        user:     req.body.username
    });
});

// My login route
app.post('/login', (req, res, next) => {
    if (verify.login(req.body)) {
        passport.authenticate('local', {
            session: true,
            successRedirect: '/user/' + req.body.username,
            failureRedirect: '/login'
        })(req, res, next);
    }
});


护照

我使用以下方法初始化护照:

require('./src/passport')(passport);

在我文件的顶部,并且所说的护照文件如下所示:


相关的password.js代码

var strategy = require('passport-local').Strategy;
var bcrypt   = require('bcrypt');
var mysql    = require('mysql');
var db       = require('./database');
var pool     = mysql.createPool(db.pool);

module.exports = (passport) => {
    passport.serializeUser((user, done) => {
        done(null, user.uid);
    });

    passport.deserializeUser((uid, done) => {
        pool.query('SELECT * FROM User WHERE (user_id = ?)', [uid], (err, result) => {
            done(err, {uid: result[0].user_id, username: result[0].username, pass: result[0].password});
        });
    });

    // Setup Passport
    passport.use(new strategy({ usernameField: 'username' }, (username, pass, done) => {
        // Match a user
        pool.query('SELECT * FROM User Where (username = ?)', [username], (err, result) => {
            if (!result.length) return done(null, false, {message: 'Username isn\'t registered'});
            let user = result[0];

            // User was found so decrpt pass
            bcrypt.compare(pass, user.password, (err, isMatch) => {
                if (err) throw err;

                // User matches
                if (isMatch)
                    return done(null, {uid: user.user_id, username: username, pass: user.password});
                else
                    done(null, false, {message: 'Password doesn\'t match'})
            });
        });
    }));
}



如果有帮助的话,交换我的函数声明的顺序也无济于事。

感谢您抽出宝贵的时间阅读这篇长篇文章,并有可能帮助我!

1 个答案:

答案 0 :(得分:0)

就目前而言,我的网站在刷新了几页后就退出了您的登录,而且在大多数情况下,我没有注意到这种情况。

出现问题是因为我正在检查req.user中是否有未登录的用户,因此返回它的唯一逻辑原因是未定义。因为我没有注意到我已注销,所以我认为无论用户登录如何,它的输出都是不确定的。

我首先通过检查req.user是否存在来确认已登录用户的存在,然后相应地设置变量,以解决此问题。