如何从Apollo解析器访问Koa上下文(和koa会话)?

时间:2020-05-25 16:01:19

标签: graphql apollo-server koa apollo-server-koa

给出以下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. 是否可以从解析器访问会话?

1 个答案:

答案 0 :(得分:2)

是的,可以从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;
    }
  }
}

希望这会有所帮助。