graphql - 如何从 Apollo 解析器访问 Koa 上下文(和 koa-session)?
问题描述
给定以下 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
函数访问会话? - 是否可以从解析器访问会话?
解决方案
是的,可以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;
}
}
}
希望这可以帮助。
推荐阅读
- python - 如何在数据透视表中单独列出列表的组件?
- pandas - 使用 pandas 和 yahoo Finance 将数据保存到 csv 文件
- git - 如果 PR 已经合并到不同的分支,有没有办法再次创建 PR 到其他分支?
- java - MySQL选择从今年到去年特定月份的所有行
- uml - 为什么它在条件下使用“ ErrCounter >= limt ”?
- image - 尽管从资产中提供了彩色图像,但 SVG 图片在颤动中返回黑色图像
- c++ - 在模板函数内的 lambda 内不会丢弃“if constexpr 分支”
- flask - Airflow Webserver 访问日志的位置
- mongodb - 如何从 MongoDB 中的查询创建集合?
- python - 在 Python re.sub 函数中,如何使用 \n 语法引用组 0?