【问题标题】:What Makes Express-Session Decide to Start a New Session?是什么让 Express-Session 决定开始一个新的会话?
【发布时间】:2019-09-23 01:23:15
【问题描述】:

我遇到了一个问题,我的代码中的一个地方(身份验证部分)在会话中放置了一些东西,而代码中的另一个地方试图访问它(我的 GraphQL API 部分)。问题是,当第二部分尝试获取数据时,它不存在。

当我登录request.session.id 时,我可以清楚地看到核心问题:在两个请求之间,会话本身发生了变化。 auth 请求发生,并且确实将数据放入会话 A,但是当 graphQL 代码访问 request.session 时,它获取会话 B,没有数据。

但是,这不是“请为我调试代码”请求。相反,我只想了解这个库是如何工作的,这样我就可以自己调试了。

谁能解释express-session如何/为什么决定(大概是在收到新请求时)它应该放弃旧会话并开始一个新会话?从我读过的内容来看,它可能与我的域设置有关,但我尝试过与那些没有成功的人一起玩,实际上我只是想了解图书馆的工作原理,特别是在决定重新使用会话或生成一个新会话。

【问题讨论】:

    标签: javascript express session express-session


    【解决方案1】:

    @machineghost 真是个好问题!关于express-session 模块的作用以及如何配置它存在很多混淆。我会尽力解释的。

    我认为围绕express-sesion 的困惑源于这样一个事实,即该模块基本上只是将网络服务器的不同方面粘合到一个地方,即req.session,用于中间件、路由以及可能(在帮助下)与存储和访问有关发出请求的“用户”(读取会话)的临时数据。

    该模块试图将三个方面粘合在一起是 http cookie、短期数据存储和通过中间件和路由传递的 javascript 对象req。为了阐明这是如何工作的,请考虑一个“正常”的 HTTP 请求,该请求已发送给使用 express-session 模块(简称 ES)的 Express 应用程序:

    • Express 将请求传递给 ES。
    • ES 查找它之前设置的 cookie。这是大多数报告的错误出现的地方。 ES 要求您的应用程序可以访问 cookie。反向代理、CORS 或 Fetch API 的错误配置都可能阻止 ES 访问它尝试在 HTTP 响应中设置的 cookie。如果每个在 ES 中遇到错误的人都打开调试器,在the entry 中为 ES 中间件设置一个断点,并寻找connect.id cookie 的存在 - ES 报告的问题会少得多,IMO。注意:您可以解决对 cookie 的要求,但它充其量只是 hacky。
    • 如果 ES 找到一个 cookie,它将使用该值在应用程序在 store 选项中配置的任何内容中查找会话。这可能是 Redis 或 MongoDB,或者如果您没有指定它只是在节点进程的内存中。
    • 如果 ES 没有找到 cookie,或者如果查找没有返回会话,它将在 req 对象上创建一个名为 session 的属性,该属性只是一个空对象,即 {} .中间件或更下游的路由都可以访问它。
    • ES 在res 对象上设置一个cookie,作为未来请求附加会话的一种方式,如上所述。
    • ES 用一个函数包装了req.end 方法,该函数将检查它是否应该保存req.session 对象。 resavesaveUninitialized 等选项将确定 ES 是否为给定请求保存会话。注意:在 HTTP 重定向的情况下,例如302、res.end方法直到新的重定向请求发出后才被调用。这意味着在重定向之前设置的会话数据对重定向的请求不可用。这是一个已知问题,解决方法是在使用 req.session.save 重定向之前显式保存会话

    关于 websockets 的注意事项

    为了让 websockets 与 ES 一起工作,在基本层面上,您必须获取附加到更改协议请求的会话并将其附加到该用户的套接字。我写了一个简单的库作为例子here。注意:这是 5 年的历史,它的创建更像是一个话题,但如果你仔细看看它是如何工作的,你就会明白这一点。

    希望对大家有所帮助,谢谢发帖!

    【讨论】:

    • 只是添加一个简短的注释,如果您正在阅读本文以调试 express-sessions 的问题,产生此问题的 GitHub 问题线程 (github.com/expressjs/session/issues/659) 包含有关我自己的个人调试的更多详细信息经验(这会导致成功的解决方案),因此您可能会发现它很有用。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2019-11-04
    • 2021-04-21
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多