Apollo, Express, сеанс WS недоступен - PullRequest
0 голосов
/ 10 марта 2020

Я использую ApolloServer с ExpressJS и WebSocket. Кроме того, я использую express-session и cookie-parser. Каким-то образом session не распределяется между Express и WebSocket. Я уже видел рабочие примеры там, но почему-то моя установка не работает.

Это мое промежуточное ПО:

import cors = require('cors');
import expressSession = require('express-session');
import expressCookieParser from 'cookie-parser';
import MongoStore from 'connect-mongo';
const SessionStore = MongoStore(expressSession);
export const allowOrigins = cors({
  credentials: true,
  origin: 'http://localhost:3000',
});

export const session = expressSession({
  store: new SessionStore({ mongooseConnection: mongoose.connection }),
  secret: APP_SECRET,
  proxy: true,
  resave: false,
  saveUninitialized: false,
  cookie: { secure: PRODUCTION },
});

export const cookieParser = expressCookieParser(APP_SECRET);

Apollo:

import { ApolloServer } from 'apollo-server-express';
import { schema, resolvers } from '../../graphql';

export const createApolloServer = () => {
  return new ApolloServer({
    introspection: APOLLO_INTROSPECTION,
    playground: APOLLO_PLAYGROUND,
    typeDefs: schema,
    resolvers,
    context: async (expressContext: ExpressContext) => {
      let session;
      if (expressContext.req) {
        session = expressContext.req.session; // different session here
        console.log('cookie express', expressContext.req.signedCookies)
      }
      if (expressContext.connection) {
        session = expressContext.connection.context.session; // different session here
        console.log('cookie websocket', expressContext.connection.context.request.signedCookies)
      }
      return <ResolverArgs>{
        expressContext,
        session,
      };
    },
    subscriptions: {
      onConnect: (params, websocket, context) => {
        const req = websocket.upgradeReq;
        const res = {} as any;
        return new Promise((rs, rj) => {
          cookieParser(req, res, () => {
            session(req, res, () => {
              console.log('share', req.session.id);
              rs({session: req.session});
            });
          });
        });
      },
    },
  });
};

Инициализация сервера:

import express from 'express';
import http from 'http';
import { allowOrigins, session, cookieParser } from './middleware/basic';
const app = express();
const server = http.createServer(app);
app.use(allowOrigins);
app.use(cookieParser);
app.use(session);
const apollo = createApolloServer();
apollo.applyMiddleware({
  app,
  path: GRAPHQL_PATH,
  cors: false,
});
apollo.installSubscriptionHandlers(server);

Я вижу, что куки отправляются с клиент и правильно разобрал. Тем не менее, я получаю разные идентификаторы сеанса в обратном вызове context apollo. Что я делаю не так? Я уже часами искал проблему, но безуспешно. Я надеюсь, что есть кто-то с большим опытом, чтобы помочь мне отследить проблему.

...