我有以下代码在Express中创建会话。
app.use(session({
secret: 'randomstring',
saveUninitialized: false,
resave: false,
cookie: {
secure: true,
maxAge: 60000 * 60 /* 1 hour */
}
}));
我主要用它来存储Passport.js中的会话数据。目前,1小时后用户会自动退出。或者会话结束,用户退出。
是否有一种简单的方法可以在会话中存储更多数据,并且针对不同的信息有不同的到期日期?所以说我希望Passport.js(req.session.passport.user
)会话数据的有效期为1小时。我希望另一条数据说例如(req.session.myDataA
)到期为30天。我希望另一段数据(req.session.myDataB
)没有过期并永远保持活跃状态。
在Express Sessions中有一种简单的方法可以实现这种行为吗?
答案 0 :(得分:2)
您可以使用Cookie并在不同的Cookie名称上设置不同的过期日期。因此,您可以拥有多个可以保存数据的Cookie,每个Cookie都会有一个特定的过期时间。
话虽这么说,我会说会话和cookie都不是解决问题的正确方法。我会保持您的会话精简并将数据存储在数据库中。考虑到您正在使用会话,您可以使用Redis并将数据存储到期。您可以将Redis中的密钥分配给您的会话。例如:
req.session.myDataA = 'user_id:myDataA'
req.session.myDataB = 'user_id:myDataB'
在Redis中设置数据时,可以使用密钥user_id:myDataA
并将其设置为过期。
// Will expire in 1 hour
SET user_id:myDataA "your data"
EXPIRE user_id:myDataA 3600
虽然密钥仍在会话中,但您可以检查该值是null
还是包含您期望的数据。
我知道这可能听起来有点复杂,但即使作为会话的一个好习惯,你真的不想存储大量数据,超出参考键,因为它变得非常难以管理。
如果您正在使用MongoDB,您还可以将文档设置为过期。但是,如果您不使用任何一种,Redis通常最容易设置并且是一个很好的会话存储。
编辑:
如下所述,不是在不同的时间范围内使您不能到期的会话,而是在数据中设置一个具有到期时间的字段。然后,当您获得该数据时,检查它是否已过期(即1小时,30天等)。
答案 1 :(得分:0)
您可以在另一个中间件
中设置会话的maxAge代码:
// after session and passport middleware
app.use(function(req, res, next) {
if (req.session.user) { // some condition
req.session.cookie.maxAge = 1000 * 60 * 60 * 24 // 24 hours
} else if (req.session.myData) {
req.session.cookie.maxAge = 1000 * 60 * 60
}
// another condition
// save the session
req.session.save()
// add next at the end of middleware
// so it can pas data edited to another middleware
next()
})