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 错误

在 GraphQL 服务器设置中何时使用 Redis 以及何时使用 DataLoader

GraphQL Dataloader 事先不知道键