Как получить доступ к контексту 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

Показывает, что Аполлон не получает ни контекста, ни сеанса.

  1. Возможен ли доступ к сеансу из context функция?
  2. Можно ли получить доступ к сеансу с резолвера?

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

Надеюсь это поможет.

Другие вопросы по тегам