passport.js req.user 未定义

passport.js req.user is undefined

我正在构建一个带有 express 并使用护照进行身份验证的 nodejs 应用程序。我是该平台的相对初学者,只使用了 3 周。我 运行 遇到了问题,因为我的服务器不保存用户信息。

我可以使用 MongoDB 作为我的数据库源正确登录。信息是从数据库中正确获取的,并且似乎可以通过护照正确验证。但是,信息不会持续存在,重定向时 req.user 未定义。

我尝试了几个小时重新排序中间件并搜索了其他问题和答案,但似乎没有任何效果!我真的不知道怎么了。

app.js `

const express = require('express');
const app = express();
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname + '/views');
const http = require('http').Server(app);
const cookieParser = require('cookie-parser');
const session = require('express-session');
const flash = require('connect-flash');
const passport = require('passport');
const io = require('socket.io')(http);
const mongo = require('./controllers/mongo');
var ObjectID = require('mongodb').ObjectID;


app.use(express.urlencoded({extended : false}));
app.set('view engine', 'ejs');
app.use(require('express-useragent').express());



app.use(cookieParser());
app.use(session({
    secret : 'secret',
    resave : true,
    saveUninitialized : true
}));
app.use(flash());
app.use((req,res,next)=> {
    res.locals.success_msg = req.flash('success_msg');
    res.locals.error_msg = req.flash('error_msg');
    res.locals.error  = req.flash('error');
    next();
})
    
app.use(passport.initialize());
app.use(passport.session());
    



//router
const router = express.Router();

async function start_app() {
    await mongo.init();
    require("./controllers/passport")(passport);
    require("./controllers/gameio")(io);

    
    
    app.use('/forums', require('./routes/forums'));
    app.use('/user', require('./routes/users'));
    app.use('/tournaments', require('./routes/tournaments'));
    app.use('/members', require('./routes/memberlist'));
    app.use('/profile', require('./routes/profile'));
    app.use('/lobby', require('./routes/lobby'));
    app.use('/game', require('./routes/game'));
    app.use('/watch', require('./routes/watch'));

}
start_app();


const server = http.listen(8080, function() {
    console.log('listening on *:8080');
});
module.exports = router;

`

护照配置 `

const express = require('express');
const router = express.Router();
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const { dbo } = require('../controllers/mongo');

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({usernameField : 'email'},async function(email,password,done) {
            //match user
            await dbo.getUser({userEmail : email})
                .then((user)=>{
                if(!user) {
                   return done(null,false,{message : 'that email is not registered'});
                }
                
                console.log(user); // returns the relevant chunk of the user table fetched
                
                //match pass
                bcrypt.compare(password,user.userPassword,(err,isMatch)=>{
                    if(err) throw err;

                    if(isMatch) {
                        return done(null,user);
                    } else {
                        return done(null,false,{message : 'pass incorrect'});
                    }
                })
            })
            .catch((err)=> {console.log(err)})
        })
        
    )
    passport.serializeUser(function(user, done) {
        console.log(user); // returns the relevant chunk of the user table fetched
        
        done(null, user);
    });
      
    passport.deserializeUser(function(id, done) {
        done(null, null);
    }); 
}; 
`

用户登录页面 `

router.post('/login',(req,res,next)=>{
passport.authenticate('local',{
        successRedirect : '/forums',
        failureRedirect : '/user/login',
        failureFlash : true,
    })(req,res,next);
 })

`

serializeUser 决定用户对象的哪些数据应该存储在session中 deserializeUser deserializeUser的第一个参数对应于给done函数的用户对象的key,所以这样做:

passport.serializeUser(function(user, done) {
    done(null, user.id);
  });
  
  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });