Dataloader не работает должным образом в графическом преобразователе - PullRequest
0 голосов
/ 18 мая 2019

У меня есть загрузчик данных вместе с моим graphql, как показано ниже:

async function testDataLoader(accountNumber, req, args) {
  const dummy = new DataLoader(async accountNumber => {
    return new Promise(async (resolve, reject) => {
      // rest call
      return resolve([<rest result>])
    });
  });

  return  dummy.load(accountNumber)
}

export default {
  Friends: {
    query1: async ({req, args}) => {
      const data = await testDataLoader(["12121"], req, args);
      // do something with data
    }

    query2: async ({req, args}) => {
      const data = await testDataLoader(["12121"], req, args);
      // do something with data
    }
  }
};

Когда мы делаем запрос вроде:

Friends {
  query1
  query2
}

Я ожидаю, что загрузчик данных будет вызывать мои службы отдыха только один раз,Тем не менее, я мог видеть, что мой отдых называется дважды.Не уверен, где я делаю ошибки.

1 Ответ

1 голос
/ 18 мая 2019

Проблема в том, что каждый раз, когда вы звоните testDataLoader, вы создаете новый экземпляр DataLoader.Вы должны создать один экземпляр DataLoader для каждого запроса (для каждого загружаемого ресурса).Таким образом, каждый раз, когда вы вызываете load, вы взаимодействуете с одним и тем же кэшем.

Вы могли бы сделать что-то вроде:

const dummy = new DataLoader(...);
async function testDataLoader(accountNumber) {
  return  dummy.load(accountNumber)
}

Но это сохранитсяDataLoader между запросами, что вы не хотите делать.Что вы должны сделать, это создать экземпляр DataLoader как часть вашего контекста, который воссоздается каждый раз, когда выполняется запрос.

const context = async ({ req }) => {
 return {
   testLoader = new DataLoader(...),
 };
},
const server = new ApolloServer({
  ...
  context,
})

Затем просто вызовите загрузчик прямо внутри вашего преобразователя:

query2: async (parent, args, context) => {
  const data = await context.testLoader.load(["12121"]);
  ...
}
...