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)
子问题:
文档指示添加“var store = new SessionStore”而不是“var store = new SequelizeStore”,但它给了我一个错误:“SessionStore 未定义”。不确定我是否做错了什么?
我可以看到“用户”表内部,但由于某种原因,我无法使用“select * from Sessions;”查看“会话”表内部 我收到“关系“会话”不存在”的响应。为什么会这样呢?

过期时间: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)
非常感谢您对我的帮助!
| 归档时间: |
|
| 查看次数: |
5409 次 |
| 最近记录: |