Я использую 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. Что я делаю не так? Я уже часами искал проблему, но безуспешно. Я надеюсь, что есть кто-то с большим опытом, чтобы помочь мне отследить проблему.