试图删除会话和 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' })
    • 将会话设置为 nullreq.session = null。一旦响应完成,这将破坏基础会话。
    • 从请求对象中删除会话 属性:delete req.session。这也会在响应结束后销毁会话。
  • 使用会话存储对象:store.destroy('MY_SESSION_ID', () => console.log('session was deleted from the store'))

无论您设置的 expires 值如何,所有这些都会取消客户端上的 cookie。