试图删除会话和cookie时表示会话混乱



我正在运行一个Node.js/Express应用程序,该应用程序使用"Express session"模块来处理会话变量。在我尝试删除会话数据和cookie之前,一切似乎都很好。实现这一点的一个代码尝试如下:

if (typeof req.session.user != "undefined") {
req.session.destroy(function(err) {
res.cookie("connect.sid", "", {
path: "/",
httpOnly: true, 
secure: false,
expires: new Date(1)
});
});
}

此代码引发以下错误:;TypeError:无法读取未定义的"的属性"id";。我不知道问题是什么。但是,如果我删除了"req.session.destroy"部分,如下所示:

if (typeof req.session.user != "undefined") {
//    req.session.destroy(function(err) {
res.cookie("connect.sid", "", {
path: "/",
httpOnly: true, 
secure: false,
expires: new Date(1)
});
// });
}

使用以上代码不会引发错误。。。然而,显然会话变量仍然存在。我很难确定cookie是否真的被删除了。显然(上面的第一块代码(不喜欢";connect.sid";名称被传递,这应该很好,因为我使用的是默认值,并且没有为cookie分配不同的名称。

我花了很多时间试图解决如何"恰当地"结束"快速会议"。例如:

我已经使用fs模块从"store.txt"文件中删除了会话变量,但(令人惊讶的是(它并没有"破坏"会话。会话变量在应用程序的另一次运行时继续"活动"。

我还试图通过传递"会话ID"(如"req.session.destroy(会话ID("(来传递destroy特定的会话变量,但没有成功。。。

然而,仅仅调用"req.session.destroy(("就可以正确地删除当前会话,但我需要消除特定会话信息的能力(例如,我试图删除的"过时/不活动"会话(,而无法做到这一点令人抓狂。这就是为什么我试图通过上面的"destroy"调用传递"会话ID"。

我故意没有定义";过期";对于cookie,根据文档,它应该将cookie视为"非持久性"。不幸的是,我的会话变量似乎确实在应用程序的不同运行中持续存在。这让我很困惑,如果cookie是非持久性的,会话变量如何在应用程序的单独执行中识别浏览器?

在这一点上,我基本上已经放弃了如何结束我的课程。出于某种原因,这似乎是一个非常严密的信息。。。或者我只是迷失了方向,无法理解。非常感谢任何关于结束(销毁(会话和销毁生成的cookie的正确方法的建议。"快速会话"模块被广泛使用,我发现令人震惊的是,关于如何正确完成这些任务的文档如此之少。

我提前感谢你。

我还试图通过传递"会话ID"(如"req.session.destroy(会话ID("(来传递destroy特定会话变量,但没有成功

我认为你搞错了。req.session始终是当前用户的会话(与手头的Request相关联(。您不需要提供ID——您只能访问当前ID。如果您想修改其他用户的会话(例如,如果一个用户注销,您也想登录其他用户(,您可以使用会话存储对象并对所有活动会话进行操作。

您可以通过以下方式删除会话:

  • 调用req.session.destroy()-您可以提供一个回调函数,在该函数中您可以保证会话已从存储中删除(因为这通常是一个异步操作(
  • 如果像这样初始化会话对象:session({ ..., unset: 'destroy' })
    • 将会话设置为null:req.session = null。一旦响应完成,这将破坏基础会话
    • 从请求对象中删除会话属性:delete req.session。这也会在响应结束后破坏会话
  • 使用会话存储对象:store.destroy('MY_SESSION_ID', () => console.log('session was deleted from the store'))

无论您设置了什么expires值,所有这些都将在客户端上取消设置cookie。

最新更新