具有数组和多个子系统的 Apollo GraphQL + DataLoader

Apollo GraphQL + DataLoader with array and multiple subsystems

如果我有这样的架构:

A {
    Values: [B] 
}

B {
    ValueFromSubSystemX: Float
    ValueFromSubSystemY: Float
}

如果客户端执行如下查询:

A {
  Values {
    ValueFromSubSystemX
  }
}

我想执行 ServiceX.GetAll() 然后执行 ServiceX.load(id) 来加载缓存数据,但我不想执行 ServiceY.GetAll(),因为我从来没有执行过 ServiceY.load(id)(因为客户端从未请求过有关 SystemY 的任何信息)。

有没有办法进行这种数据加载?

我找到的一个不太漂亮的解决方案是在每个请求中请求所有内容,并让数据加载器跟踪我们是否应该转到子系统进行调用。解决方案可能如下所示:

const resolvers = {
  B: {
    async ValueFromSubSystemX (root, args, context) {
      await context.loaders.subSystemX.getAllValues('all')
      return await context.loaders.subSystemX.valueById(root.id)
    },
    async ValueFromSubSystemY (root, args, context) {
      await context.loaders.subSystemY.getAllValues('all')
      return await context.loaders.subSystemY.valueById(root.id)
    }
  }
}

getAllValues 正在呼叫 valueById.prime(idFromSubSystem, valueFromSubSystem)

不要忘记在 getAllValues 上关闭批处理。如果未禁用它,您的数据加载器可能会非常慢,具体取决于您的实现方式。