Javascript 是什么让Express Session决定开始新的会话?

Javascript 是什么让Express Session决定开始新的会话?,javascript,express,session,express-session,Javascript,Express,Session,Express Session,我遇到了一个问题,在我的代码中,身份验证部分在会话中放置了一些内容,而代码中的另一个地方试图访问它,即GraphQLAPI部分。问题是,当第二部分试图获取数据时,它不在那里 当我记录request.session.id时,我可以清楚地看到核心问题:在两个请求之间,会话本身会发生变化。auth请求发生,并将数据放入会话A,但当graphQL代码访问request.session时,它会得到会话B,而没有数据 但是,这不是一个请为我调试代码的请求。相反,我只想了解这个库是如何工作的,这样我就可以自己

我遇到了一个问题,在我的代码中,身份验证部分在会话中放置了一些内容,而代码中的另一个地方试图访问它,即GraphQLAPI部分。问题是,当第二部分试图获取数据时,它不在那里

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

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


有人能解释一下express session是如何/为什么决定接受一个新的请求的,即它应该放弃旧的会话并开始一个新的会话吗?据我所知,它可能与我的域设置有关,但我尝试过使用这些设置,但没有成功,我真的只想了解库的工作原理,特别是在决定重新使用会话或生成新会话方面。

@machineghost这是一个很好的问题!关于express session模块的功能以及如何配置它,存在很多困惑。我会尽力解释的

我认为围绕express sesion的混淆源于这样一个事实,即模块基本上只是将Web服务器的不同方面粘合到一个位置,即req.session,用于中间件、路由,并可能通过帮助websocket连接来存储和访问有关发出请求的用户读取会话的临时数据

模块试图粘合在一起的三个方面是http cookies、短期数据存储和通过中间件和路由传递的javascript对象req。要了解其工作原理,请考虑一个普通的HTTP请求,该请求已发送给使用Express会话模块ES的Express应用程序:

Express将请求传递给ES。 ES查找它以前设置的cookie。这是大多数报告的bug出现的地方。ES要求您的应用程序能够访问cookie。反向代理、COR或Fetch API的配置不正确都可能会阻止代理访问它试图在HTTP响应中设置的cookie。如果每个在ES中遇到错误的人都打开了一个调试器,在ES中间件中设置一个断点,并查找connect.id cookie的存在,那么据我所知,ES报告的问题就会少很多。注意:您可以绕过cookie的要求,但这充其量只是黑客行为。 如果ES找到cookie,它将使用该值在应用程序在store选项中配置的任何内容中查找会话。这可能是Redis或MongoDB,或者如果您没有指定它,则它只是在节点进程的内存中。 如果ES没有找到cookie,或者如果查找没有返回会话,它将在名为session的req对象上创建一个属性,它只是一个空对象,即{}。中间件或更进一步的路由都可以访问这个。 ES在res对象上设置cookie,作为将来请求连接会话的一种方式,如上所述。 ES使用一个函数包装该方法,该函数将检查该方法是否应保存req.session对象。选项(如和)将确定ES是否为给定请求保存会话。注意:在HTTP重定向的情况下,例如302,res.end方法直到发出新重定向的请求后才被调用。这意味着在重定向之前设置的会话数据对重定向请求不可用。这是一个已知问题,解决方法是在使用req.session.save重定向之前显式保存会话 关于WebSocket的注释 为了让WebSocket在基本级别上使用ES,您必须将附加到请求更改协议的会话附加到该用户的套接字上。我写了一个简单的lib作为例子。注意:这是5年前创建的,更多的是作为一个谈话点,但如果你仔细看看它是如何工作的,你就会得到这个想法


我希望所有这些都能帮助你,谢谢你的发帖

@machineghost多好的问题啊!关于express session模块的功能以及如何配置它,存在很多困惑。我会尽力解释的

我认为围绕express sesion的混淆源于这样一个事实,即模块基本上只是将Web服务器的不同方面粘合到一个位置,即req.session,用于中间件、路由,并可能通过帮助websocket连接来存储和访问有关发出请求的用户读取会话的临时数据

模块试图粘合在一起的三个方面是http cookies、短期数据存储和通过中间件和路由传递的javascript对象req。让我们了解一下它是如何工作的 试想一下向使用Express会话模块ES的Express应用程序发出的正常HTTP请求:

Express将请求传递给ES。 ES查找它以前设置的cookie。这是大多数报告的bug出现的地方。ES要求您的应用程序能够访问cookie。反向代理、COR或Fetch API的配置不正确都可能会阻止代理访问它试图在HTTP响应中设置的cookie。如果每个在ES中遇到错误的人都打开了一个调试器,在ES中间件中设置一个断点,并查找connect.id cookie的存在,那么据我所知,ES报告的问题就会少很多。注意:您可以绕过cookie的要求,但这充其量只是黑客行为。 如果ES找到cookie,它将使用该值在应用程序在store选项中配置的任何内容中查找会话。这可能是Redis或MongoDB,或者如果您没有指定它,则它只是在节点进程的内存中。 如果ES没有找到cookie,或者如果查找没有返回会话,它将在名为session的req对象上创建一个属性,它只是一个空对象,即{}。中间件或更进一步的路由都可以访问这个。 ES在res对象上设置cookie,作为将来请求连接会话的一种方式,如上所述。 ES使用一个函数包装该方法,该函数将检查该方法是否应保存req.session对象。选项(如和)将确定ES是否为给定请求保存会话。注意:在HTTP重定向的情况下,例如302,res.end方法直到发出新重定向的请求后才被调用。这意味着在重定向之前设置的会话数据对重定向请求不可用。这是一个已知问题,解决方法是在使用req.session.save重定向之前显式保存会话 关于WebSocket的注释 为了让WebSocket在基本级别上使用ES,您必须将附加到请求更改协议的会话附加到该用户的套接字上。我写了一个简单的lib作为例子。注意:这是5年前创建的,更多的是作为一个谈话点,但如果你仔细看看它是如何工作的,你就会得到这个想法


我希望所有这些都能帮助你,谢谢你的发帖

只是为了添加一个快速注释,如果您阅读此文章是为了在express会话中调试问题,那么产生此问题的GitHub问题线程包含有关我个人调试经验的更多详细信息,这些经验可以成功解决问题,因此您可能会发现它很有用。只是为了添加一个快速注释,如果您阅读本文是为了在express会话中调试问题,那么产生此问题的GitHub问题线程包含有关我个人调试经验的更多详细信息,这些经验可以成功解决问题,因此您可能会发现它很有用。