首页 > 解决方案 > 如何从 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 没有收到上下文,也没有收到会话。

  1. 是否可以从context函数访问会话?
  2. 是否可以从解析器访问会话?

标签: graphqlapollo-serverkoaapollo-server-koa

解决方案


是的,可以sessioncontext函数中访问,方法如下:

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;
    }
  }
}

希望这可以帮助。


推荐阅读