Как получить доступ к контексту Koa (и koa-сессии) из преобразователей Apollo?
При следующей инициализации приложения Koa:
const apolloServer = new ApolloServer({
...processSchema(schemas),
...graphqlConfig,
cors: false, // already present with Koa
context: ctx => {
console.log( "*** 2", ctx.session );
// -> *** 2 undefined
}
});
const app = new Koa();
const serverHttp = app
.use(cors(CORS_CONFIG))
.use(session(SESSION_CONFIG, app))
.use(async (ctx, next) => {
console.log( "*** 1", ctx.session );
// *** 1 Session { ...session object }
await next();
if (!ctx.body) {
ctx.throw(404);
}
})
.use(koaBody())
.use(apolloServer.getMiddleware())
.listen(port)
;
Как видите, любой запрос GraphQL будет выводить
*** 1 Session { ...session object }
*** 2 undefined
Показывает, что Аполлон не получает ни контекста, ни сеанса.
- Возможен ли доступ к сеансу из
context
функция? - Можно ли получить доступ к сеансу с резолвера?
1 ответ
Решение
Да, можно получить доступ session
от context
функция, и вот как это сделать:
const server = new ApolloServer({
typeDefs,
resolvers,
context: (req) => {
const { session } = req.ctx;
// return an object with whatever properties you
// need to be accessible inside resolvers as `context`
return {
userSession: session
}
}
})
Затем внутри вашего resolver
, вы можете получить к нему доступ следующим образом:
const resolvers = {
Query: {
books: (parent, args, context) {
const { userSession } = context;
const books = [...];
return books;
}
}
}
Надеюсь это поможет.