Dataloader 在 graphql 解析器中没有按预期工作

Dataloader is not working as expected in graphql resolver

我有一个数据加载器和我的 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
}

我希望数据加载器只调用我的休息服务一次。但是,我可以看到我的休息被叫了两次。不确定,我在哪里犯了错误。

问题是每次调用 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"]);
  ...
}