试图删除会话和 cookie 的 Express-session 混淆
Express-session confusion attempting to delete session and cookie
我正在 运行使用 'express-session' 模块处理会话变量的 Node.js/Express 应用程序。在我尝试删除会话数据和 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)
});
});
}
此代码抛出以下错误:“类型错误:无法读取未定义的 属性 '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 分配不同的名称。
我花了很多时间试图解决如何 'properly' 结束 'express-session' 的问题。例如:
...我已经使用 fs 模块从我的 'store.txt' 文件中删除了会话变量,但是(令人惊讶的是)它没有 'destroy' 会话。会话变量在应用程序的另一个 运行 上继续 'live'。
...我还试图通过传递 'session ID' 来破坏特定的会话变量,例如 'req.session.destroy(session ID)' 但没有成功...
...然而,只需调用 'req.session.destroy()' 即可正确删除当前会话,但我需要能够消除特定会话信息(例如,我试图删除的 'stale/inactive' 会话)和无法做到这一点令人抓狂。这就是为什么我试图通过上面的 'destroy' 调用来传递 'session ID'。
...我有意没有为 cookie 定义“过期”,根据文档,它应该将 cookie 视为 'non persistent'。不幸的是,我的会话变量似乎确实存在于应用程序的不同 运行 上。这让我感到困惑,如果 cookie 不是持久性的,会话变量如何在应用程序的单独执行中识别浏览器?
至此,我基本上已经放弃了如何结束我的会话。出于某种原因,这似乎是非常严密保护的信息……或者我只是迷路了,超出了我的理解范围。非常感谢任何关于结束(销毁)会话和销毁生成的 cookie 的正确方法的建议。 'express-session' 模块被广泛使用,我发现关于如何正确完成这些任务的文档如此匮乏令人震惊。
先谢谢你了。
I have also attempted to pass a destroy particular session variables by passing a 'session ID' such as 'req.session.destroy(session ID)' without any success
我想你弄错了。 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。
我正在 运行使用 'express-session' 模块处理会话变量的 Node.js/Express 应用程序。在我尝试删除会话数据和 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)
});
});
}
此代码抛出以下错误:“类型错误:无法读取未定义的 属性 '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 分配不同的名称。
我花了很多时间试图解决如何 'properly' 结束 'express-session' 的问题。例如:
...我已经使用 fs 模块从我的 'store.txt' 文件中删除了会话变量,但是(令人惊讶的是)它没有 'destroy' 会话。会话变量在应用程序的另一个 运行 上继续 'live'。
...我还试图通过传递 'session ID' 来破坏特定的会话变量,例如 'req.session.destroy(session ID)' 但没有成功...
...然而,只需调用 'req.session.destroy()' 即可正确删除当前会话,但我需要能够消除特定会话信息(例如,我试图删除的 'stale/inactive' 会话)和无法做到这一点令人抓狂。这就是为什么我试图通过上面的 'destroy' 调用来传递 'session ID'。
...我有意没有为 cookie 定义“过期”,根据文档,它应该将 cookie 视为 'non persistent'。不幸的是,我的会话变量似乎确实存在于应用程序的不同 运行 上。这让我感到困惑,如果 cookie 不是持久性的,会话变量如何在应用程序的单独执行中识别浏览器?
至此,我基本上已经放弃了如何结束我的会话。出于某种原因,这似乎是非常严密保护的信息……或者我只是迷路了,超出了我的理解范围。非常感谢任何关于结束(销毁)会话和销毁生成的 cookie 的正确方法的建议。 'express-session' 模块被广泛使用,我发现关于如何正确完成这些任务的文档如此匮乏令人震惊。
先谢谢你了。
I have also attempted to pass a destroy particular session variables by passing a 'session ID' such as 'req.session.destroy(session ID)' without any success
我想你弄错了。 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。