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