我正在阅读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个不同的请求吗?
答案 0 :(得分:3)
我们做一些假设:
数据库返回的User
对象包含一个用于最好的朋友的ID的字段(我们将其称为bestFriendId
)。用户朋友的ID存储在单独的表中。
给定一个用户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
的时间bestFriend
返回的用户上解析me
的时间friends
返回的用户上解决me
时,是bestFriend
返回的每个用户上解决friends
字段时,使用DataLoader仍然会导致多个请求,但是将有助于减少对同一资源的重复请求(例如,当多个用户将同一用户列为好友时)。