GraphQL,Dataloader,[ORM or not],有很多关系理解
Posted
技术标签:
【中文标题】GraphQL,Dataloader,[ORM or not],有很多关系理解【英文标题】:GraphQL, Dataloader, [ORM or not], hasMany relationship understanding 【发布时间】:2019-02-09 10:32:15 【问题描述】:我第一次使用 Facebook 的数据加载器 (https://github.com/facebook/dataloader)。
我不明白当我有一对多关系时如何使用它。
这里重现了我的问题:https://enshrined-hydrant.glitch.me。
如果您在 Playground 中使用此查询:
query
persons
name
bestFriend
name
opponents
name
你得到了价值。
但是如果你在这里打开控制台日志:https://glitch.com/edit/#!/enshrined-hydrant 你可以看到我想避免的这些数据库调用:
我的人员类型是:
type Person
id: ID!
name: String!
bestFriend: Person
opponents: [Person]
我可以使用适合bestFriend: Person
的数据加载器,但我不明白如何将它与opponents: [Person]
一起使用。
如您所见,解析器必须返回一个值数组。
你有什么暗示吗?
【问题讨论】:
【参考方案1】:您需要创建批处理端点以使用数据加载器 - 它不能自己进行批处理。
例如,您可能需要以下端点:
GET /persons - returns all people
POST /bestFriends, Array<personId>` - returns an array of best friends matchin the corresponding array of `personId`s
然后,您的数据加载器可能如下所示:
function batchedBestFriends(personIds)
return fetch('/bestFriends',
method: 'POST',
body: JSON.stringify(personIds))
).then(response => response.json());
// We assume above that the API returns a straight array of the data.
// If the data was keyed, you could add another accessor such as
// .then(data => data.bestFriends)
// The `keys` here will just be the accumulated list of `personId`s from the `load` call in the resolver
const bestFriendLoader = new DataLoader(keys => batchedBestFriends(keys));
现在,您的解析器将如下所示:
const PersonType = new GraphQLObjectType(
...
bestFriend:
type: BestFriendType,
resolve: (person, args, context) =>
return bestFriendLoader.load(person.id);
);
【讨论】:
以上是关于GraphQL,Dataloader,[ORM or not],有很多关系理解的主要内容,如果未能解决你的问题,请参考以下文章
为GraphQL Server自动生成DataLoader!
如何将 Mongoose 与 GraphQL 和 DataLoader 一起使用?
Apollo GraphQL DataLoader DynamoDb
初始化 Graphql 应用程序时出现 org.dataloader.DataLoaderRegistry 错误