Я использую Apollo Server 2 (, но эта проблема не только с Apollo ) и Express.js vanilla (с apollo-server-express
).
Все хорошо работает и с Подписками , кроме механизма Экспресс-сессия .
Проблема:
Я использую cookie-сессия (https://github.com/expressjs/cookie-session,, но я думаю, что это то же самое для express-session middleware) и когда мой браузер устанавливает новое соединение на моем сервере хук ApolloServer onConnect
не имеет атрибута req
, а также req.session
и так далее ...
Что я могу сделать, так это разобрать куки с webSocket.upgradeReq.headers.cookie
в onConnect
хуке жизненного цикла, но мне кажется, что он очень хакерский.
Код:
const { ApolloServer } = require('apollo-server-express')
const typeDefs = require('../src/graphql/types')
const resolvers = require('../src/graphql/resolvers')
const models = require('../src/models')
const apolloServer = new ApolloServer({
typeDefs,
resolvers,
context: ({ req, connection }) => {
// connection exists only on webSocket connection
if (connection) {
return {
currentUser: connection.context.currentUser // <-- I NEED THIS!
}
}
// if not a (webSocket) connection it is a "default" HTTP call
return {
models,
currentUser: { id: req.user.id }
}
},
subscriptions: {
onConnect: (connectionParams, webSocket) => {
// "connectionParams" is from the client but I cannot use it because cookies are HTTP-Only
// I can retrieve cookies from here: "webSocket.upgradeReq.headers.cookie" but then I need to parse them which seems a bit hacky to me
// return { currentUser: req.user.id } // <-- I NEED THIS (req.user.id doesn't exists)!
}
}
})
module.exports = apolloServer
Я не могу найти ничего на сайте Apollo Server Docs (для других тем очень хорошо задокументировано!).
Где я не так делаю?