Вы должны добавить это к вышесказанному.

ользую локальную стратегию паспорта, которая хорошо работает с экспресс:

passport.use(localStrategy);
passport.serializeUser((user, done) => done(null, JSON.stringify(user)));
passport.deserializeUser((obj, done) => done(null, JSON.parse(obj)));
app.use(passport.initialize());
app.use(passport.session());

Этот localStrategy выполняет вызов Mongoose, чтобы получить пользователя на основе его pubKey, и я думаю, что request.user заполняется таким образом.

Я настраиваю свою конечную точку graphql следующим образом:

app.use('/graphql', bodyParser.json(), graphqlExpress(request => ({
  debug: true,
  schema,
  context: {
    user: request.user,
    req: request,
  },
  formatError: (e) => {
    console.log(JSON.stringify(e, null, 2));
    return e;
  },
})));

И мои подписки таким образом:

const ws = createServer(app);

// Run the server
ws.listen(settings.APP_PORT, () => {
  console.log(`App listening on port ${settings.APP_PORT}!`);
  // Set up the WebSocket for handling GraphQL subscriptions
  new SubscriptionServer({
    execute,
    subscribe,
    schema,
    onConnect: (connectionParams, webSocket) => {
      console.log(webSocket.upgradeReq);
      return { user: connectionParams };
    },
  }, {
    server: ws,
    path: '/subscriptions',
  });
});

Моя сессия хорошо работает над запросами и мутациями graphql. Но не с моими подписками.

Моя цель - получить доступ к сеансу пользователя в контексте распознавателя подписки. Мне может понадобиться доступ к чему-то вроде request.user в onConnect для заполнения контекста, но я не знаю, как это сделать.

Ответы на вопрос(1)

после некоторой переделки я понял, что вам нужно запустить все, что воссоздаетpassport для розеткиupgradeReq повторно запустив промежуточное программное обеспечение:

// Start with storing the middleware in constants
const passportInit = passport.initialize();
const passportSession = passport.session();
app.use(passportInit);
app.use(passportSession);

...
// Now populate the request with the upgradeReq using those constants
onConnect: (connectionParams, webSocket) => new Promise((resolve) => {
  passportInit(webSocket.upgradeReq, {}, () => {
    passportSession(webSocket.upgradeReq, {}, () => {
      resolve(webSocket.upgradeReq);
    });
  });
}),

Если вы используетеexpress-session Вы должны добавить это к вышесказанному.

Ваш ответ на вопрос