Как получить доступ к контексту Koa (и koa-сессии) из преобразователей Apollo? - PullRequest
0 голосов
/ 25 мая 2020

При следующей инициализации приложения 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 не получает контекст, ни session.

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

1 Ответ

2 голосов
/ 25 мая 2020

Да, можно получить доступ к 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;
    }
  }
}

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

...