Apollo GraphQL + DataLoader,带有阵列和多个子系统

时间:2018-04-04 14:22:43

标签: graphql apollo graphql-js apollo-server

如果我的架构看起来像这样:

A {
    Values: [B] 
}

B {
    ValueFromSubSystemX: Float
    ValueFromSubSystemY: Float
}

如果客户端执行如下所示的查询:

A {
  Values {
    ValueFromSubSystemX
  }
}

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

无论如何都要做这种数据加载吗?

1 个答案:

答案 0 :(得分:0)

一个,不是那么漂亮,我发现的解决方案是在每个请求中请求所有请求,并让数据加载器跟踪我们是否应该去子系统接听电话。解决方案看起来像这样:

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上的批量处理。如果没有禁用,您的数据加载器可能会非常慢,具体取决于您的实现方式。