GraphQL-此架构中的请求数

时间:2018-11-07 05:05:08

标签: graphql

我正在阅读DataLoader(https://github.com/facebook/dataloader)的文档,其中的以下陈述让我开始思考。考虑以下GraphQL模式:

{
  me {
    name
    bestFriend {
      name
    }
    friends(first: 5) {
      name
      bestFriend {
        name
      }
    }
  }
}

对于上述架构,如文档所述:

Naively, if me, bestFriend and friends each need to request the backend, 
there could be at most 13 database requests!

我真的没有得到上面的陈述,有人可以帮助我了解上面的模式中如何有13个不同的请求吗?

1 个答案:

答案 0 :(得分:3)

我们做一些假设:

  1. 数据库返回的User对象包含一个用于最好的朋友的ID的字段(我们将其称为bestFriendId)。用户朋友的ID存储在单独的表中。

  2. 给定一个用户ID数组,我们无法发出单个请求来获取所有相关用户,但必须为每个ID发出一个请求(如果您使用的是数据库,则不太可能,但这是非常现实的可能性(如果您的数据源是其他API而不是数据库)。

您的解析器可能看起来像这样:

const resolvers = {
  Query: {
    me: (root, args, ctx) => User.getById(ctx.id),
  },
  User: {
    bestFriend: (user) => User.getById(user.bestFriendId),
    friends: (user, args) => Friends.getByUser(user.id, args.limit).map(User.getById)
  }
}

逐步浏览解析器,我们将看到13个对数据源的调用:

    解决me 的时间
  • 1 bestFriend返回的用户上解析me的时间
  • 1 friends返回的用户上解决me时,是
  • 6
  • bestFriend 返回的每个用户上解决friends字段时,
  • 5

使用DataLoader仍然会导致多个请求,但是将有助于减少对同一资源的重复请求(例如,当多个用户将同一用户列为好友时)。