如何从 Apollo 解析器访问 Koa 上下文(和 koa-session)?
How to access Koa context (and koa-session) from Apollo resolvers?
鉴于以下 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
显示 Apollo 没有收到上下文,也没有收到会话。
- 是否可以从
context
函数访问会话?
- 是否可以从解析器访问会话?
是的,可以从 context
函数访问 session
,方法如下:
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;
}
}
}
希望对您有所帮助。
鉴于以下 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
显示 Apollo 没有收到上下文,也没有收到会话。
- 是否可以从
context
函数访问会话? - 是否可以从解析器访问会话?
是的,可以从 context
函数访问 session
,方法如下:
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;
}
}
}
希望对您有所帮助。