Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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
Node.js 请求之外的会话、验证和操作_Node.js_Mongodb_Session_Redis - Fatal编程技术网

Node.js 请求之外的会话、验证和操作

Node.js 请求之外的会话、验证和操作,node.js,mongodb,session,redis,Node.js,Mongodb,Session,Redis,我的应用程序在登录时将用户的文档从数据库加载到redis会话中。然后,它对会话对象执行几乎所有的请求验证 问题:修改请求/响应周期之外正在进行的会话以更新验证信息 例如,如果用户订阅了博客文章类别,他们可以阅读该类别中的文章,也可以对该类别作出贡献。但是,如果该类别的主持人决定删除它,那么我不仅需要从磁盘数据库中的用户文档中删除该类别,还需要从redis中的用户会话中删除该类别 据我所知,我能做到这一点的唯一方法是在数据库的用户文档中保存对会话id的引用,并在redis中查找相应的会话 问题是,

我的应用程序在登录时将用户的文档从数据库加载到redis会话中。然后,它对会话对象执行几乎所有的请求验证

问题
:修改请求/响应周期之外正在进行的会话以更新验证信息

例如,如果用户订阅了博客文章类别,他们可以阅读该类别中的文章,也可以对该类别作出贡献。但是,如果该类别的主持人决定删除它,那么我不仅需要从磁盘数据库中的用户文档中删除该类别,还需要从redis中的用户会话中删除该类别

据我所知,我能做到这一点的唯一方法是在数据库的用户文档中保存对会话id的引用,并在redis中查找相应的会话


问题是,我不确定会话是否设计为在请求/响应周期之外进行修改,因为我在谷歌搜索时没有看到任何相关主题的人希望这样做。

我不认为在mongo上存储会话信息是一个好主意。如果用户同时从两个设备登录,会发生什么情况?我猜在这种情况下,您将有两个会话对象(否则,应该有一种机制来猜测给定用户的会话,这样您就不会有当前的问题)

我的建议是将用户启动的会话集存储在redis中。当用户登录时,您可以将新会话id添加到一个集合中,并将该用户id作为密钥的一部分。当用户注销时,您将从集合中删除相应的条目

当然,在用户没有手动注销的情况下,您会遇到会话过期的问题(如果您有这种行为)。为此,您可以在每次启动新会话时将exp设置为用户集。只要您的SETEXP时间比会话到期时间稍长,您就可以确定会话将在会话存在期间存储在您的集合中


新版本的redis将有一个Observe命令,可以更容易地删除从set对象中删除的会话。您只需观察会话对象的创建/删除过程,就可以根据该过程管理集合的插入/删除。在该命令正式发布之前,您必须坚持按时间过期。

因此,在用户请求之外修改用户会话不会导致无法预见的问题?在服务器端完成时,用户会话只是字段的集合,然后是识别该会话的机制,通常通过包含会话id的cookie。只要您不更改会话密钥或删除应用程序其余部分所依赖的任何字段,您在更改会话值时应该不会遇到任何问题。我正在考虑形成一个应用程序端,特定用户的所有会话与单个redis键/值之间的外键关系,该redis键/值存储用户的会话对象,其到期时间在访问到与会话键/值相同的ttl(1天)时更新。所以它应该是:
sess1:123,sess2:123,sess3:123,user:123:{user json object}
。在应用程序端,我会查询'user+':'+\u id(借用自用户的mongo\u id),然后设置setex更新ttl以及任何更改。你认为这是个好主意吗?听起来是个好计划。根据您希望如何管理会话信息,您可能更喜欢使用Redis哈希,而不是将对象存储为JSON。这样,您就可以直接从Redis设置/获取单独的会话值,并且可以省去每次编写或读取json时序列化/反序列化json的麻烦