Dataloader кешируется при создании контекста (graphQl ApolloServer) - PullRequest
0 голосов
/ 11 февраля 2020

Я интегрировал DataLoaders в мои запросы graphQL, но по какой-то причине кеш запоминается между запросами. Я могу прочитать, что передача функции в контекст в конфигурации ApolloServer должна создавать новый контекст при каждом запросе, но по какой-то причине DataLoaders запоминается даже тогда.

Это мой код

Apollo Config:

export default new ApolloServer({
  resolvers,
  typeDefs,
  context: ({ req, res }) => generateContext(req, res)
});

generateContext:

const generateContext = (req: Express.Request, res: Express.Response) => ({
  ...generateLoaders(),
  res,
  req
});

generateLoaders:

import * as questionLoaders from './questionLoaders';

const generateLoaders = () => ({
  questionLoaders
});

questionLoader:

const batchQuestions = async (ids: number[]) => {
  const questions = await Question.query().findByIds(ids);
  return ids.map((id) => questions.find((q) => q.id === id));
};

export const questionLoader = new dataloader((ids: number[]) => batchQuestions(ids));

1 Ответ

1 голос
/ 11 февраля 2020

Вы вызываете конструктор DataLoader только один раз, а затем экспортируете полученный экземпляр DataLoader как константу. Даже если ваша контекстная функция вызывается при каждом запросе, она использует импортированное значение, которое всегда совпадает с экземпляром DataLoader. Измените экспорт так, чтобы он был функцией:

export const createQuestionLoader = () => new dataloader((ids: number[]) => batchQuestions(ids));

Затем вы можете импортировать его и вызвать функцию внутри context:

import { createQuestionLoader } from '...'

const generateContext = (req: Express.Request, res: Express.Response) => ({
  QuestionLoader: createQuestionLoader(),
  res,
  req
});
...