expression不同的到期

我有以下代码在Express中创build会话。

app.use(session({ secret: 'randomstring', saveUninitialized: false, resave: false, cookie: { secure: true, maxAge: 60000 * 60 /* 1 hour */ } })); 

我主要使用这个将会话数据存储在Passport.js中。 目前1小时后,用户会自动注销。 或者会话结束,用户注销。

有没有简单的方法在会话中存储更多的数据,并有不同的信息到期date? 所以说我想Passport.js( req.session.passport.user )会话数据有一个1小时到期。 我想要另一个数据片段(例如req.session.myDataA )的有效期为30天。 而我希望另一块数据( req.session.myDataB )没有到期并永远保持活动状态。

在Express Sessions中是否有一种简单的方法来实现这种行为?

您可以使用Cookie并在不同的Cookie名称上设置不同的过期时间。 所以你可以有多个cookie来保存数据,每个都会有一个特定的过期。

话虽如此,我会说,这两个会议和cookies不会是你的问题的正确解决scheme。 我会保持您的会话精简并将数据存储在数据库中。 考虑到您正在使用会话,您可以使用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或具有您期望的数据。

我知道这可能听起来有点复杂,但即使是会议的一个好习惯,你也不希望存储大量的数据,超出了参考的关键点,因为它变得很难pipe理。

如果你正在使用MongoDB,你也可以设置文件到期。 但是,如果你不使用,Redis通常会是最容易设置的,并且是一个很好的会话存储。

编辑:

如下所述,不是在不同的时间段内将会话过期,而是仅仅在数据中设置一个字段到期时间。 那么当你得到这些数据时,检查是否已经过期(即1小时,30天等)。

你可以在另一个中间件中设置session的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() })