DataLoader在GraphQL解析器中无法正常工作



我和我的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
}

我希望DataLoader只能致电我的REST服务一次。但是,我能够看到我的休息被称为两次。不确定,我在哪里犯错。

问题是,每次您调用 testDataLoader时,都在创建一个新实例的数据载体实例。您应该根据请求创建一个单个数据加载程序实例(每个您要加载的资源(。这样,每当您致电load时,您都在与同一缓存进行交互。

可以做类似:

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

,这将在您不想这样做的请求之间持续存在数据加载程序。您应该做的是在上下文的一部分中创建数据加载程序实例,每次执行请求时都会重新创建。

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"]);
  ...
}

最新更新