Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 快速会话不同过期时间_Javascript_Node.js_Session_Express_Cookies - Fatal编程技术网

Javascript 快速会话不同过期时间

Javascript 快速会话不同过期时间,javascript,node.js,session,express,cookies,Javascript,Node.js,Session,Express,Cookies,我有以下代码在Express中创建会话 app.use(session({ secret: 'randomstring', saveUninitialized: false, resave: false, cookie: { secure: true, maxAge: 60000 * 60 /* 1 hour */ } })); 我主要使用它在Passport.js中存储会话数据。当前用户在1小时后自动注销。或者会话结束,

我有以下代码在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会话中实现此行为?

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

话虽如此,我想说会话和cookie都不是解决问题的正确方法。我会让你的会话保持精简,并将数据存储在数据库中。考虑到您正在使用会话,您可以使用Redis并存储过期的数据。您可以将Redis中的密钥分配给会话。例如:

req.session.myDataA = 'user_id:myDataA'
req.session.myDataB = 'user_id:myDataB'
在Redis中设置数据时,可以使用键
user\u id:myDataA
并将其设置为过期

// Will expire in 1 hour
SET user_id:myDataA "your data"
EXPIRE user_id:myDataA 3600
当密钥仍在会话中时,您可以检查该值是否为
null
,或者是否具有所需的数据

我知道这听起来可能有点复杂,但即使是会话的良好实践,您也不希望存储大量数据,超出引用键,因为它变得非常难以管理

如果您使用的是MongoDB,还可以将文档设置为过期。但是,如果您不使用任何一种,Redis通常是最容易设置的,并且是一个很好的会话存储

编辑:


正如下面所评论的,与其让会话在不同的时间框架内过期,不如在数据中设置一个带有过期时间的字段。然后,当您获得该数据时,检查它是否已过期(即1小时、30天等)。

您可以在另一个中间件中设置会话的最大值

代码:


我的意思是现在我只在会话中存储用户id。但Passport.js可以处理大部分问题。我认为这个答案比我想要的要复杂一些。如果可能的话,我希望与我现有的Passport.js实现集成,并尽可能保持高水平。最简单的解决方案可能是在数据中设置一个带有过期时间的字段,而不是在不同的时间范围内使会话过期。然后,当您获得该数据时,检查它是否已过期(例如,1小时、30天等)。如果我想在会话中存储用户和我的数据,那么这将无法工作。我想在会话中存储多个内容,每个内容都有不同的过期时间。请原谅,您是指会话中具有不同过期时间的“内容”吗?会话过期时是否应该过期?是。因此,我在课程中有很多内容。每个都有不同的过期时间。会话本身我希望永远不会过期。只是里面的东西有不同的过期时间。它正在工作。它可以为不同的会话设置不同的过期时间。在我的例子中,我使用一个Redis数据库来存储会话数据,这段代码运行得很好。有没有理由不使用?@GabrielBleu Local Storage在存储会话类型数据方面存在缺陷。Cookie随每个请求一起发送到特定域。本地存储没有。
// 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()
})