使用 connect-session-sequelize 实现持久会话

Sil*_*mäe 6 postgresql session persistent node.js express

我正在制作一个带有登录系统的网站,我希望用户即使在浏览器关闭后也能够保持登录状态。仅当用户注销时才销毁会话。我在网上搜索了解决方案,并发现了使用connect-session-sequelize 的建议。我阅读了文档并尽最大努力使代码正常工作,但我在这方面缺乏经验,这成为了障碍。

问题:

我的代码没有给出服务器重新启动后保持用户登录的结果。我的代码是:

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
var session = require('express-session');
var SequelizeStore = require('connect-session-sequelize')(session.Store);

var pug = require('pug');
var bodyParser = require('body-parser');
var bcrypt = require('bcrypt');

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(express.static('public'));
app.use(cookieParser());

app.set('views', './views');
app.set('view engine', 'pug');

var Sequelize = require('sequelize');
var db = new Sequelize('postgres://'+ process.env.POSTGRES_USER + ':' + 
process.env.POSTGRES_PASSWORD + '@localhost/terranova', {
    host: 'localhost',
    dialect: 'postgres',
    storage: './session.postgres', 
    define: {
      timestamps: true
    }
});

var sessionStore = new SequelizeStore({
    db: db,
    checkExpirationInterval: 15 * 60 * 1000,
    expiration: 24 * 60 * 60 * 60 * 1000 
});

app.use(session({
  secret: 'salajhgdusdajss',
  store: sessionStore,
  resave: false,
  saveUninitialized: false,
  proxy: true
}));

sessionStore.sync()

var Session = db.define('Session', {
    sid: {
      type: Sequelize.STRING,
      primaryKey: true
    },
    userId: Sequelize.STRING,
    expires: Sequelize.DATE,
    data: Sequelize.STRING(50000)
});

var User = db.define('user', {
  username: Sequelize.STRING,
  password: Sequelize.STRING,
});

function extendDefaultFields(defaults, session) {
  return {
    data: defaults.data,
    expires: defaults.expires,
    userId: session.userId
  };
}

var store = new SequelizeStore({ 
   db: db,
   table: 'Session',
   extendDefaultFields: extendDefaultFields
});
Run Code Online (Sandbox Code Playgroud)

子问题

  1. 文档指示添加“var store = new SessionStore”而不是“var store = new SequelizeStore”,但它给了我一个错误:“SessionStore 未定义”。不确定我是否做错了什么?

  2. 我可以看到“用户”表内部,但由于某种原因,我无法使用“select * from Sessions;”查看“会话”表内部 我收到“关系“会话”不存在”的响应。为什么会这样呢? 在此输入图像描述

  3. 过期时间:24 * 60 * 60 * 1000 --> 默认过期时间为24小时。这是否表明会议时间?如果是,最长可能的时间是多少(如果不可能无限制)?

有人可以解释一下我需要从代码中执行/添加/删除什么才能实现我的目标吗?

欲了解更多信息,这里是登录页面...

app.get('/login', function(req,res) {
    res.render('login')
})

app.post('/login', function(req,res) {
    var username = req.body.username
    var password = req.body.password

    User.findOne({
        where: {
            username: username
        }
    }).then(function(user) {
        if(username.length === 0 || password.length === 0) {
             res.render('login', {
                message: "Username or password missing"
            });
            return;
        };
        if(user == null) {
            res.render('login', {
                message: "User not in the system, please register"
            }); 
            return;
        } else {
            var hash = user.password
            bcrypt.compare(password, hash, function(err, result) {
                if (err) {
                    res.render('login', {
                        message: 'Invalid email or password, please try again or register'
                    })
                };
                if(result === true) {
                    req.session.user = user;
                    res.redirect('/home');
                }
                else {
                    res.render('login', {
                        message: "Something went wrong, please try again"
                     });
                };
            });
        };
    });
})
Run Code Online (Sandbox Code Playgroud)

...这是主页。

app.get('/home', function(req,res) {
    var user = req.session.user

    if (user === undefined) {
        res.render('login', {
            message: 'Please log in to have the access'
        });
    } else {
        res.render('home', {
            user: user
        });
    }
})
Run Code Online (Sandbox Code Playgroud)

非常感谢您对我的帮助!