NodeJS Express会话在页面刷新后到期

asw*_*dia 5 node.js express express-session

登录后,每次刷新页面时,nodejs应用程序的会话将到期。如果我访问其他页面,效果很好,但是刷新页面后,会话就会结束。我尝试了几件事,但似乎都没有用。刷新页面后如何防止它过期?如果我可以将会话存储在数据库中或其他地方以防止其过期。

这是文件

Passport-init.js

 var mongoose = require('mongoose');
 var User = mongoose.model('user');
 var localStrategy = require('passport-local').Strategy;
 var bcrypt = require('bcrypt-nodejs');

module.exports = function(passport) {

passport.serializeUser(function(user, done) {
    console.log('serializing user:',user.username);
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {

    User.findById(id, function(err, user) {

        if(err) {
            done(500,err);
        }
        console.log('deserializing user:',user.username);
        done(err, user);
    });
});

passport.use('login', new localStrategy({
    passReqToCallback : true
},
    function(req, username, password, done) {

        User.findOne({'username': username},

            function(err, user) {

                if(err) {
                    return done(err);
                }            
                if(!user) {
                    console.log("UserName or Password Incorrect");
                    return done(null, false);
                }
                if(!isValidPassword(user, password)) {
                    console.log("UserName or Password is Incorrect");
                    return done(null, false);
                }

                return done(null, user);
            });
    }));


passport.use('signup', new localStrategy({
    passReqToCallback : true

}, function(req, username, password, done) {

        User.findOne({'username': username},

            function(err, user) {

                if(err) {
                    console.log("Error in signup");
                    return done(err);
                }
                if(user) {
                    console.log("Username already exist" + username);
                    return(null, false);
                }
                else {

                    var newUser = new User();

                    newUser.username = username;
                    newUser.password = createHash(password);

                    newUser.save(function(err) {
                        if(err) {
                            console.log("Error in saving user");
                            throw err;
                        }
                        console.log(newUser.username + ' Registration succesful');    
                        return done(null, newUser);
                    });
                }

            });
}));


var isValidPassword = function(user, password) {
    return bcrypt.compareSync(password, user.password);
}

var createHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(10), null);
}
};
Run Code Online (Sandbox Code Playgroud)

Auth.js

var express = require('express');
var router = express.Router();

module.exports = function(passport) {

router.get('/success', function(req, res) {

    res.send({state: 'success', user: req.user ? req.user : null});
});

router.get('/failure', function(req, res) {

    res.send({state: 'failure', user: null, message: 'Invalid Username or Password'});
});

router.post('/login', passport.authenticate('login', {

    successRedirect: '/auth/success',
    failureRedirect: '/auth/failure'
}));

router.post('/signup', passport.authenticate('signup', {

    successRedirect: '/auth/success',
    failureRedirect: '/auth/failure'
}));

router.get('/logout', function(req, res) {

    req.logout();
    res.redirect('/');
});

return router;

};
Run Code Online (Sandbox Code Playgroud)

Server.js

var express = require('express');
var path = require('path');
var app = express();
var server = require('http').Server(app);
var logger = require('morgan');
var passport = require('passport');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var mongoose = require('mongoose');
var MongoStore = require('connect-mongo')(session);

 mongoose.connect("mongodb://localhost:27017/scriptknackData");
 require('./models/model');

 var api = require('./routes/api');
 var auth = require('./routes/auth')(passport);

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());

app.use(session({
secret: 'super secret key',
resave: true,
cookie: { maxAge: 60000 },
saveUninitialized: true,
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));

var initpassport = require('./passport-init');
initpassport(passport);

app.use('/api', api);
app.use('/auth', auth);

 // catch 404 and forward to error handler
 app.use(function(req, res, next) {
 var err = new Error('Not Found');
 err.status = 404;
 next(err);
});


var port = process.env.PORT || 3000;
server.listen(port, function() {

console.log("connected");
});
Run Code Online (Sandbox Code Playgroud)

rob*_*lep -2

根据精美手册(重点是我的):

请注意,启用会话支持完全是可选的,但建议大多数应用程序启用它。如果启用,请务必使用express.session()beforepassport.session()以确保登录会话按正确的顺序恢复。

就您而言,顺序不正确。尝试这个:

...
app.use(session({
secret: 'super secret key',
resave: true,
cookie: { maxAge: 60000 },
saveUninitialized: true,
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));

app.use(passport.initialize());
app.use(passport.session());
...
Run Code Online (Sandbox Code Playgroud)