Я использую Apollo Server 2 (но эта проблема не только с Apollo) и Express.js vanilla (с apollo-server-express
).
Все также хорошо работает с Подписками, кроме механизма Экспресс-сеанса.
Проблема:
Я использую cookie-session (https://github.com/expressjs/cookie-session, но я думаю, что это то же самое для промежуточного программного обеспечения express-session), и когда мой браузер запускает новое соединение с моим сервером, хук ApolloServer onConnect
не имеет атрибута req
и ни req.session
и тд ...
Что я могу сделать, так это проанализировать файлы cookie из 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 (другие темы очень хорошо документированы!).
Где я делаю не так?