Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我怎么能有两个快速会议?_Javascript_Express_Passport.js_Express Session - Fatal编程技术网

Javascript 我怎么能有两个快速会议?

Javascript 我怎么能有两个快速会议?,javascript,express,passport.js,express-session,Javascript,Express,Passport.js,Express Session,我有一个Passport应用程序,使用GraphQL端点和/logout端点。出于某种原因,当我从GraphQL端点内部调用request.isAuthenticated()时,我返回了true,但当我从/logout端点内部进行相同的调用时,我返回了false 所以,我做了一点日志记录(关于request.session.id),结果我以某种方式结束了两个会话。更奇怪的是,我的GraphQL端点使用的会话是持久的:如果我重新启动服务器,它会保持相同的ID,而/logout中的ID会不断变化 我

我有一个Passport应用程序,使用GraphQL端点和
/logout
端点。出于某种原因,当我从GraphQL端点内部调用
request.isAuthenticated()
时,我返回了
true
,但当我从
/logout
端点内部进行相同的调用时,我返回了
false

所以,我做了一点日志记录(关于
request.session.id
),结果我以某种方式结束了两个会话。更奇怪的是,我的GraphQL端点使用的会话是持久的:如果我重新启动服务器,它会保持相同的ID,而
/logout
中的ID会不断变化

我认为正在发生的是,持久会话是基于cookie/DB的,因此在客户端发出第一个请求时会被恢复,而
/logout
会话不是基于cookie的,会被服务器重置。我不明白的是为什么我有两个疗程

以下是相关代码:

// Session setup
const store = new KnexSessionStore({ knex, tablename: 'sessions' });
app.use(
  session({
    cookie: { maxAge: 1000 * 60 * 60 * 24 * 5},
    secret: `a secret`,
    store
  })
);

// Passport setup
passport.serializeUser((user, done) => done(null, user));
passport.deserializeUser((user, done) => done(null, user));

app.use(passport.initialize());
app.use(passport.session());

// GraphQL Setup
// NOTE: request.session.id from inside a function in schema = persistent session
const graphQLHandler = graphqlHTTP(request =>({ graphiql: true, schema }));
app.use('/graphql', graphQLHandler);

// Logout Setup
app.get('/logout', (request, response) => {
  // NOTE: request.session.id = non-persistent session
  response.send(`user has been logged out`); // someday do request.logout()
});
如您所见,快速会话设置功能(
会话
)只调用一次。我确实调用
app.use(passport.session())
(看起来可能正在创建第二个会话),但我的理解是,这行只告诉passport使用会话。。。它不会创建一个单独的并行会话


有人能解释一下发生了什么,以及我如何让我的应用程序共享一个会话吗?或者,如果有人能解释一下,我可以在哪里添加一些代码,以便在创建会话时抛出错误(这样我就可以知道代码的哪一部分创建了第二个会话),这也会很有帮助。

我找到了答案!显然我不是唯一一个有这个问题的人:。你可以在那里看到所有的细节,但是

TLDR:我的客户机是从服务器
获取
-ing
/logout
。但是,默认情况下,
fetch
不会设置
{credentials:'same origin'}
选项,显然您需要提供该选项,否则Passport会自动开始创建重复会话:(

因此,我的服务器代码根本没有问题,修复程序只是在客户端执行以下操作:

fetch(`/logout`, { credentials: 'same-origin' });
这里希望Passport的人开始抛出错误、警告或其他东西来回应这个案例,而不是让他们的可怜的用户对这个无法解释但很常见的结果感到困惑(回答的评论有15个大拇指)