【问题标题】:Apollo GraphQL + DataLoader with array and multiple subsystems带有数组和多个子系统的 Apollo GraphQL + DataLoader
【发布时间】:2018-09-14 03:58:12
【问题描述】:

如果我的架构如下所示:

A {
    Values: [B] 
}

B {
    ValueFromSubSystemX: Float
    ValueFromSubSystemY: Float
}

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

A {
  Values {
    ValueFromSubSystemX
  }
}

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

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

【问题讨论】:

    标签: graphql apollo graphql-js apollo-server


    【解决方案1】:

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

    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 上的批处理功能。如果它没有被禁用,你的数据加载器可能会很慢,这取决于你如何实现它。

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2019-02-09
      • 2023-03-05
      • 2021-01-08
      • 2019-11-10
      • 2020-10-16
      • 2019-10-29
      • 2018-05-16
      • 2018-05-23
      相关资源
      最近更新 更多