大约 3 分钟后Express.js会话丢失

Express.js session lost after about 3min

提问人:Paweł Baca 提问时间:11/29/2017 最后编辑:Paweł Baca 更新时间:10/28/2022 访问量:945

问:

我使用 express.js 和 React。成功登录后,我存储在会话中,但在 2-3 分钟后会话丢失,当我刷新页面时,他们注销了我。 这是我server.jsuser_id

var mysql = require('mysql');
var connection  = mysql.createConnection({
  host     : 'host',
  user     : 'user',
  password : 'password',
  database : 'database',
  pool     : { maxConnections: 50, maxIdleTime: 30},
});

connection.connect(function(error){
    if(!!error){
        console.log('error');
    }else{
        console.log('Connected');
    }
})
//pluginy
var bodyParser = require('body-parser');
var express = require('express');
var session = require('express-session');
var app = express();
//ustwienia
app.use(bodyParser()); //przesylanie danych w req.body
app.set('trust proxy', 1) // trust first proxy
app.use(session({
    secret: 'v8bRRj7XVC6Dvp',
    saveUninitialized: true,
    resave: true,
    cookie: {secure: true}
}));
app.use('/static', express.static(__dirname + '/src'));
app.use('/dist', express.static(__dirname + '/dist'));
app.use('/php', express.static(__dirname + '/php'));
app.set('views', __dirname + '/views');
app.set('view engine','pug');

function checkAuth(req, res, next) {
    console.log('User id: '+req.session.user_id);

  if (!req.session.user_id) {
      if(req.route.path=='/'){
          res.render("indexNotLogin",{title:''});
      }else{
        res.send('You are not authorized to view this page');
    }
  } else {
    next();
  }
}

//roots
    //index
    app.get('/', checkAuth, function(req, res){
        res.render("index",{title:''});
    })
    //funkcje
    app.get('/funkcje', function(req, res){
        res.render("funkcje",{title:''});
    })

//trylogin
    app.post('/trylogin', function(req, res){
        var username = req.body.name;
        var password = req.body.password;
        connection.query("SELECT * FROM user WHERE username='"+username+"' AND pass='"+password+"' LIMIT 1", function(error, rows,fields){
            //callback
            if(!!error){
                console.log('error in query');
            }else{
                if(rows.length){
                    console.log(rows[0].id)
                    req.session.user_id = rows[0].id;
                    res.redirect('/');
                }else{
                    res.send('user dont exist')
                }
            }
        })

    })
app.listen(3000,'0.0.0.0', function(){
    console.log('Port: 3000')
})

表单提交后,我做功能和工作正常,是user_id,但为什么会话丢失得这么快?/tryloginreq.session.user_id = rows[0].id

node.js Express 会话 服务器端

评论


答:

2赞 wrangler 11/29/2017 #1

您可以使用会话中间件中的选项来增加会话时间:maxAge

app.use(session({
    secret: 'v8bRRj7XVC6Dvp',
    saveUninitialized: true,
    resave: true,
    cookie: {maxAge:900000} //here ,15 min session time
}));

评论

0赞 Paweł Baca 11/29/2017
如果我使用 cookie:我的会话不起作用,但如果我设置它正常工作。你知道我该如何解决这个问题吗?{secure: true,maxAge:900000}{secure: false,maxAge:900000}
0赞 wrangler 11/29/2017
secure 基本上用于 https 连接,而不是普通的 HTTP。如果你认为没有必要,那么我认为你不应该使用。
0赞 Paweł Baca 11/29/2017
我的会话仍然无法解决同样的问题,嗯......我在脚本末尾使用了我忘记在帖子中添加这个。你知道为什么这仍然只能工作 2-3 分钟吗?{secure: false,maxAge:900000}app.listen(3000, function(){})
0赞 Sabiul Sabit 3/3/2022 #2

我通过使用包解决了这个问题。express-mysql-session

//import
const session = require('express-session');
const MySQLStore = require('express-mysql-session')(session);

let options = {
  host: process.env.hostNameDB,
  port: 3306,
  user: process.env.userNameDB,
  password: process.env.passwordDB,
  database: process.env.databaseName,
  expiration: 1000 * 60 * 60 * 24,
  clearExpired: true,
  checkExpirationInterval: 1000 * 60 * 60 * 24, //per day db cleaning
};

let sessionStore = new MySQLStore(options);

app.use(session({
  key: 'session_cookie_name',
  secret: 'session_cookie_secret',
  store: sessionStore,
  resave: false,
  saveUninitialized: false,
}));

通过使用此包,您可以正确存储会话数据,然后在交叉时从数据库中删除数据。checkExpirationInterval