具有数组和多个子系统的 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
上关闭批处理。如果未禁用它,您的数据加载器可能会非常慢,具体取决于您的实现方式。
如果我有这样的架构:
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
上关闭批处理。如果未禁用它,您的数据加载器可能会非常慢,具体取决于您的实现方式。